Massage

/*
 * Valve.c
 *
 *  Created on: 2025年3月7日
 *      Author: mis
 */


/* Includes ------------------------------------------------------------------*/
#include "Valve.h"
#include "..\Main\include.h"
#include <stddef.h>


/* Private define ------------------------------------------------------------*/
#define Valve_MappingData_Max		20			//阀体地址映射数据最大长度
#define Massage_ActionTime			15*60*100	//10ms单位


/* Private typedef -----------------------------------------------------------*/
/*!< 阀体点位映射环形队列 */
typedef struct
{
	uint16_t Head;
	uint16_t Tail;
	uint16_t Length;
	uint32_t Data[Valve_MappingData_Max];
} Valve_Mapping_List;
static Valve_Mapping_List ValveMappingList = {0};					//阀体点位映射环形队列
extern const Massage_Mode_TypeDef Massage_Mode[Massage_Mode_Max];	//按摩气袋动作功能表

/*!< 按摩动作执行回调函数 */
static void Massage_Knead_Process_1(void);
static void Massage_Knead_Process_2(void);
static void Massage_Knead_Process_3(void);
static void Massage_Knead_Process_4(void);
static void Massage_Knead_Process_4_1(void);
static void Massage_Knead_Process_4_2(void);
static void Massage_Knead_Process_5(void);
static void Massage_Knead_Process_6(void);
static void Massage_Knead_Process_7(void);
static void Massage_Knead_Process_8(void);
static void Massage_Knead_Process_9(void);
static void Massage_Knead_Process_10(void);
static void Massage_Knead_Process_11(void);
static void Massage_Knead_Process_12(void);
static void Massage_Knead_Process_13(void);
static void Massage_Knead_Process_14(void);
static void Massage_Knead_Process_15(void);
static void Massage_Knead_Process_off(void);
static Action_Callback MassageKnead[MassageKnead_Mode_Max] =
{
	[MassageKnead_Mode_1] = Massage_Knead_Process_1,
	[MassageKnead_Mode_2] = Massage_Knead_Process_2,
	[MassageKnead_Mode_3] = Massage_Knead_Process_3,
	[MassageKnead_Mode_4] = Massage_Knead_Process_4,
	[MassageKnead_Mode_4_1] = Massage_Knead_Process_4_1,
	[MassageKnead_Mode_4_2] = Massage_Knead_Process_4_2,
	[MassageKnead_Mode_5] = Massage_Knead_Process_5,

	[MassageKnead_Mode_6] = Massage_Knead_Process_6,
	[MassageKnead_Mode_7] = Massage_Knead_Process_7,
	[MassageKnead_Mode_8] = Massage_Knead_Process_8,
	[MassageKnead_Mode_9] = Massage_Knead_Process_9,
	[MassageKnead_Mode_10] = Massage_Knead_Process_10,
	[MassageKnead_Mode_11] = Massage_Knead_Process_11,
	[MassageKnead_Mode_12] = Massage_Knead_Process_12,
	[MassageKnead_Mode_13] = Massage_Knead_Process_13,
	[MassageKnead_Mode_14] = Massage_Knead_Process_14,
	[MassageKnead_Mode_15] = Massage_Knead_Process_15,

	[MassageKnead_Mode_off] = Massage_Knead_Process_off,
};

/*!< 按摩气袋动作执行调度表 */
Massage_TypeDef Massage =
{
	.Mode = &Massage_Mode[0],
	.CurrAction = NULL,
	.NextAction = NULL,

	.KeepTime = Massage_ActionTime,
	.CurrTime = 0,
	.StepTime = 0,
	.ActionCount = 0,
	.ActionNumber = 0,

	.Strength = Massage_Strength_2,
	.ActionMapping = 0,
	.LastMapping = 0,
};

/*!< 揉捏按摩动作执行调度表 */
Massage_Knead_TypeDef Massage_Knead =
{
	.SupportTimeUp = {200, 200, 200, 300, 350, 400},			//背部上支撑气袋充气时间
	.KneadTimeUp = {2, 2, 2, 2, 2, 2},			//背部小气袋充气时间
	.SupportTimeCount = 0,
	.ActionCount = 0,
	.ActionFlag = 0,
	.Massage = &Massage,
	.Action_CB = NULL,
};

/*!< 侧翼动作执行调度表 */
BackWing_TypeDef BackWing =
{
	.InTimer = {50, 80, 100, 120, 140, 160},			//侧翼充气时间
	.OutTimer = {6000, 6000, 6000, 6000, 6000, 6000},	//侧翼泄气时间
	.TimerCount = 0,
	.ActionType = BackWing_None,
	.Strength = Wing_Strength_1,
	.State = BackWing_Stop,
};


/* Private function prototypes -----------------------------------------------*/
/**
  * @brief  Valve_MappingData_WriteList -- 写入阀体映射地址数据列表
  * @param  Data:映射地址数据写入
  * @retval none
  */
void Valve_MappingData_WriteList(uint32_t Data)
{
	if(ValveMappingList.Length >= Valve_MappingData_Max)
	{
		return;
	}
	ValveMappingList.Data[ValveMappingList.Tail] = Data;
	ValveMappingList.Tail = (ValveMappingList.Tail + 1)%Valve_MappingData_Max;
	ValveMappingList.Length++;
}


/**
  * @brief  Valve_MappingData_ReadList -- 读取阀体映射地址数据列表
  * @param  Data:映射地址数据
  * @retval none
  */
void Valve_MappingData_ReadList(uint32_t *Data)
{
	if(ValveMappingList.Length == 0)
	{
		*Data = 0xFFFFFFFF;
		return;
	}
	*Data = ValveMappingList.Data[ValveMappingList.Head];
	ValveMappingList.Head = (ValveMappingList.Head + 1)%Valve_MappingData_Max;
	ValveMappingList.Length--;
}


/**
  * @brief  Massage_Mode_Set -- massage设置模式
  * @param  ID:按摩id
  * @retval none
  */
void Massage_Mode_Set(uint8_t ID)
{
	if(ID < Massage_Knead_Action_Max)
	{
		if(ID < Massage_Mode_Max)
		{
			/*!< 如果是普通按摩需要把揉捏按摩停止 */
			MassageKnead_Stop();
		}
		Wing_Stop();
		Massage.ActionNumber = Massage_Mode[ID].ActionStep;
		Massage.CurrAction = &Massage_Mode[ID].Parameter[0];
		if(Massage.ActionNumber > 1)
		{
			Massage.NextAction = &Massage_Mode[ID].Parameter[1];
		}
		else
		{
			Massage.NextAction = &Massage_Mode[ID].Parameter[0];
		}
		Massage.ActionCount = 0;

		Massage.ID = ID;
		Massage.StepTime = 0;
		Massage.CurrTime = 0;

		Massage.ActionMapping = 0;
		Massage.LastMapping = 0;
	}
}


/**
  * @brief  MassageKnead_Mode_Set -- massage揉捏设置模式
  * @param  ID:按摩id
  * @retval none
  */
void MassageKnead_Mode_Set(uint8_t ID)
{
	if(ID < MassageKnead_Mode_Max)
	{
		/*!< 揉捏按摩需要把普通按摩停止 */
		Massage_Stop();
		Wing_Stop();
		if(Massage_Knead.ActionFlag == 0)
			Massage_Knead.ActionCount = 0;
		else if(Massage_Knead.ActionFlag == 1)
			Massage_Knead.ActionCount = 0;
		Massage_Knead.SupportTimeCount = 0;
		Massage_Knead.Action_CB = &MassageKnead[ID];
	}
}


/**
  * @brief  Massage_Stop -- 按摩停止
  * @param  none
  * @retval none
  */
void Massage_Stop(void)
{
	Massage.CurrAction = NULL;
	Massage.NextAction = NULL;
	Massage.ActionCount = 0;
	Massage.ActionNumber = 0;
	Massage.CurrTime = 0;
	Massage.ActionMapping = 0;
	Massage.LastMapping = 0;
	Massage.StepTime = 0;
	Massage.ModeActionCount = 0;
	Valve_MappingData_WriteList(Massage.ActionMapping);
}

void Massage_Stop_1(uint32_t Data)
{
	Massage.CurrAction = NULL;
	Massage.NextAction = NULL;
	Massage.ActionCount = 0;
	Massage.ActionNumber = 0;
	Massage.CurrTime = 0;
	Massage.ActionMapping = 0;
	Massage.LastMapping = 0;
	Massage.StepTime = 0;
	Massage.ModeActionCount = 0;
	Valve_MappingData_WriteList(Data);
}


/**
  * @brief  MassageKnead_Stop -- 揉捏按摩停止
  * @param  none
  * @retval none
  */
void MassageKnead_Stop(void)
{
	Massage_Knead.ActionCount = 0;
	Massage_Knead.SupportTimeCount = 0;
	Massage_Knead.Action_CB = &MassageKnead[MassageKnead_Mode_off];
}


/**
  * @brief  Wing_Stop -- 侧翼停止
  * @param  none
  * @retval none
  */
void Wing_Stop(void)
{
	BackWing.TimerCount = 0;
	BackWing.ActionType = BackWing_None;
}


/**
  * @brief  Massage_Strength_Set -- massage设置强度
  * @param  Strength:按摩强度
  * @retval none
  */
void Massage_Strength_Set(Massage_Strength Strength)
{
	if(Strength < Massage_Strength_Max)
	{
		Massage.StepTime = 0;
		Massage.Strength = Strength;
	}
}


/**
  * @brief  Wing_Set -- 侧翼设置
  * @param  WingMode:侧翼类型
  * @param  WingState:侧翼模式
  * @retval none
  */
void Wing_Set(Wing_ModeTypeDef WingMode, Wing_State WingState)
{
	if(WingMode < BackWing_None)
	{
		Massage_Stop();
		MassageKnead_Stop();
		BackWing.ActionType = WingMode;
		BackWing.State = WingState;
	}
}


/**
  * @brief  Wing_StrengthSet -- 侧翼强度设置
  * @param  Strength:动作强度
  * @retval none
  */
void Wing_StrengthSet(Wing_Strength Strength)
{
	if(Strength < Wing_Strength_Max)
	{
		BackWing.Strength = Strength;
	}
}


/**
  * @brief  Massage_Set_Mapping -- 按摩设置阀体工作映射
  * @param  Mapping:阀体映射地址
  * @param	State:阀体映射状态
  * @retval none
  */
static void Massage_Set_Mapping(uint32_t Mapping, Massage_State State)
{
	if(State == Massage_Infate)
	{
		Massage.ActionMapping |= Mapping;
	}
	else
	{
		Massage.ActionMapping &= ~Mapping;
	}
}


/**
  * @brief  BackWing_Process -- 侧翼执行动作
  * @param  none
  * @retval none
  */
void BackWing_Process(void)
{
	if(BackWing.ActionType == BackWing_None)
	{
		return;
	}

	BackWing.TimerCount++;

	switch(BackWing.State)
	{
	case BackWing_Start:
		if(BackWing.TimerCount == 1)
		{
			if(BackWing.ActionType == BackWing_Left)
			{
				Gasholder_IN;
				BACK_SIDE_L_IN;
			}
			else if(BackWing.ActionType == BackWing_Right)
			{
				Gasholder_IN;
				BACK_SIDE_R_IN;
			}
		}
		else if(BackWing.TimerCount >= BackWing.InTimer[BackWing.Strength])
		{
			if(BackWing.ActionType == BackWing_Left)
			{
				BACK_SIDE_L_HOLD;
			}
			else if(BackWing.ActionType == BackWing_Right)
			{
				BACK_SIDE_R_HOLD;
			}
			Wing_Stop();
			Gasholder_HOLD;
		}
		break;
	case BackWing_Stop:
		if(BackWing.TimerCount == 1)
		{
			if(BackWing.ActionType == BackWing_Left)
			{
				//Gasholder_OUT;
				BACK_SIDE_L_OUT;
			}
			else if(BackWing.ActionType == BackWing_Right)
			{
				//Gasholder_OUT;
				BACK_SIDE_R_OUT;
			}
		}
		else if(BackWing.TimerCount >= BackWing.OutTimer[BackWing.Strength])
		{
			if(BackWing.ActionType == BackWing_Left)
			{
				BACK_SIDE_L_HOLD;
			}
			else if(BackWing.ActionType == BackWing_Right)
			{
				BACK_SIDE_R_HOLD;
			}
			Wing_Stop();
			Gasholder_HOLD;
		}
		break;
	}
}


/**
  * @brief  Massage_Process -- 阀体执行动作
  * @param  none
  * @retval none
  */
void Massage_Process(void)
{
	/*!< 执行揉捏按摩前先执行前置动作 */
	if(Massage_Knead.Action_CB != NULL)
	{
		Massage_Knead.Action_CB[0]();
	}

	/*!< 当前执行的按摩动作为空直接返回 */
	if(Massage.CurrAction == NULL)
	{
		return;
	}

	/*!< 按摩时间超过设置的时间直接返回 */
	if(++Massage.CurrTime >= Massage.KeepTime)
	{
		Massage_Stop();
		return;
	}

	Massage.StepTime++;

	/*!< 执行第一次按摩动作 */
	if(Massage.ActionCount == 0 && Massage.StepTime == 1)
	{
		if(Massage.CurrAction != NULL)
		{
			Massage_Set_Mapping(Massage.CurrAction->Mapping, Massage_Infate);
		}
	}

	/*!< 执行提前打开的气袋点位 */
	if(Massage.StepTime == Massage.CurrAction->KeepTime[Massage.Strength] - Massage.NextAction->AheadOPenTime[Massage.Strength])	//提前打开下一个按摩步骤
	{
		/*!< 按摩动作执行有具体数量(0x00为无限循环),达到次数时就不需要提前打开下一个按摩点位 */
		if(Massage.Mode[Massage.ID].ActionCount != Massage_ModeActionCount_Max)
		{
			if(Massage.ModeActionCount < Massage.Mode[Massage.ID].ActionCount)
			{
				if(Massage.NextAction != NULL)
				{
					Massage_Set_Mapping(Massage.NextAction->Mapping, Massage_Infate);
				}
			}
		}
		else if(Massage.Mode[Massage.ID].ActionCount == Massage_ModeActionCount_Max)
		{
			if(Massage.NextAction != NULL)
			{
				Massage_Set_Mapping(Massage.NextAction->Mapping, Massage_Infate);
			}
		}
	}
	/*!< 当前按摩点位时间到了 */
	if(Massage.StepTime == Massage.CurrAction->KeepTime[Massage.Strength])
	{
		/*!< 关闭当前步骤的按摩阀体 */
		if(Massage.CurrAction != NULL)
		{
			Massage_Set_Mapping(Massage.CurrAction->Mapping, Massage_Leakage);
		}

		Massage.ActionCount++;

		/*!< 计算当前步骤和下一次的步骤 */
		if(Massage.ActionCount == Massage.ActionNumber - 1)
		{
			Massage.CurrAction = &Massage.Mode[Massage.ID].Parameter[Massage.ActionCount];
			Massage.NextAction = &Massage.Mode[Massage.ID].Parameter[0];
		}
		else if(Massage.ActionCount > Massage.ActionNumber - 1)
		{
			Massage.ActionCount = 0;
			Massage.CurrAction = &Massage.Mode[Massage.ID].Parameter[Massage.ActionCount];
			if(Massage.ActionNumber > 1)
			{
				Massage.NextAction = &Massage.Mode[Massage.ID].Parameter[Massage.ActionCount + 1];
			}
			else
			{
				Massage.CurrAction = &Massage.Mode[Massage.ID].Parameter[Massage.ActionCount];
			}

			/*!< 按摩步骤有的执行数就需要在达到执行数的时候关闭当前按摩 */
			if(Massage.Mode[Massage.ID].ActionCount != Massage_ModeActionCount_Max)
			{
				if(++Massage.ModeActionCount >= Massage.Mode[Massage.ID].ActionCount)
				{
					Massage_Stop();
				}
			}
		}
		else
		{
			Massage.CurrAction = &Massage.Mode[Massage.ID].Parameter[Massage.ActionCount];
			Massage.NextAction = &Massage.Mode[Massage.ID].Parameter[Massage.ActionCount + 1];
		}

		Massage.StepTime = 0;
	}

	/*!< 按摩点位映射 */
	if(Massage.LastMapping != Massage.ActionMapping)
	{
		Valve_MappingData_WriteList(Massage.ActionMapping);
	}
	Massage.LastMapping = Massage.ActionMapping;
}


//小米揉捏
static void Massage_Knead_Process_1(void)
{
	switch(Massage_Knead.ActionCount)
	{
		case 0:	//支撑气袋充气
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 1)
			{
				BACK_SIDE_Surface_L_IN;
				CUSHION_L_IN;
			}
			else if(Massage_Knead.SupportTimeCount == Massage_Knead.SupportTimeUp[Massage_Knead.Massage->Strength])
			{
				BACK_SIDE_Surface_L_HOLD;
				CUSHION_L_HOLD;
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 1;
			}
			break;
		case 1:	//小气袋充气
			if(Massage.CurrAction == NULL)
			{
				Massage_Knead.SupportTimeCount++;
				//if(Massage_Knead.SupportTimeCount == 1)
				{
					PM.UC.L34 = 1;
					PM.UC.L35 = 1;
					PM.UC.L9 = 1;
					PM.UC.L8 = 1;
					PM.UC.L6 = 1;
					PM.UC.L4 = 1;
				}
				//else if(Massage_Knead.SupportTimeCount == Massage_Knead.KneadTimeUp[Massage_Knead.Massage->Strength])
				{
					Massage_Knead.SupportTimeCount = 0;
					Massage_Knead.ActionCount = 2;
				}
			}
			break;
		case 2:
			if(Massage.CurrAction == NULL)
			{
				Massage_Mode_Set(MassageKnead_Action_1);
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 3;
			}
			break;
		case 3:
			if(Massage.CurrAction == NULL)
			{
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 0;
			}
			break;
		case 4:
			break;
	}
}

//小米双滑背
static void Massage_Knead_Process_2(void)
{
	switch(Massage_Knead.ActionCount)
	{
		case 0:	//支撑气袋充气
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 1)
			{
				BACK_SIDE_Surface_L_IN;
				CUSHION_L_IN;
			}
			else if(Massage_Knead.SupportTimeCount == 200)
			{
				BACK_SIDE_Surface_L_HOLD;
				CUSHION_L_HOLD;
				Massage_Mode_Set(MassageKnead_Action_2);
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 1;
			}
			break;
		case 1:	//小气袋充气
			if(Massage.CurrAction == NULL)
			{

			}
			break;
	}
}

//小米伸展
static void Massage_Knead_Process_3(void)
{
	switch(Massage_Knead.ActionCount)
	{
		case 0:	//支撑气袋充气
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 1)
			{
				BACK_SIDE_Surface_L_IN;
				CUSHION_L_IN;
			}
			else if(Massage_Knead.SupportTimeCount == Massage_Knead.SupportTimeUp[Massage_Knead.Massage->Strength])
			{
				BACK_SIDE_Surface_L_HOLD;
				CUSHION_L_HOLD;
				Massage_Mode_Set(MassageKnead_Action_3);
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 1;
			}
			break;
		case 1:	//小气袋充气
			if(Massage.CurrAction == NULL)
			{

			}
			break;
	}
}

//小米指压筋膜枪
static void Massage_Knead_Process_4(void)
{
	#define yuchongshijian		100
	#define zhixingshijian		300

	switch(Massage_Knead.ActionCount)
	{
		case 0:
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 1)
			{
				Massage_Stop_1(Valve_Point_1);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian)
			{
				Massage_Mode_Set(MassageKnead_Action_4_1);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian + zhixingshijian)
			{
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 1;
			}
			break;
		case 1:
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 1)
			{
				Massage_Stop_1(Valve_Point_2);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian)
			{
				Massage_Mode_Set(MassageKnead_Action_4_2);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian + zhixingshijian)
			{
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 2;
			}
			break;
		case 2:
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 1)
			{
				Massage_Stop_1(Valve_Point_3);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian)
			{
				Massage_Mode_Set(MassageKnead_Action_4);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian + zhixingshijian)
			{
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 3;
			}
			break;
		case 3:
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 1)
			{
				Massage_Stop_1(Valve_Point_4);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian)
			{
				Massage_Mode_Set(MassageKnead_Action_5);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian + zhixingshijian)
			{
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 4;
			}
			break;
		case 4:
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 1)
			{
				Massage_Stop_1(Valve_Point_5);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian)
			{
				Massage_Mode_Set(MassageKnead_Action_6);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian + zhixingshijian)
			{
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 5;
			}
			break;
		case 5:
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 1)
			{
				Massage_Stop_1(Valve_Point_6);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian)
			{
				Massage_Mode_Set(MassageKnead_Action_7);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian + zhixingshijian)
			{
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 0;
			}
			break;
	}
}

//小米揉捏筋膜枪
static void Massage_Knead_Process_4_1(void)
{
	#define yuchongshijian1		80
	#define zhixingshijian1		300
	#define diqidaiyuchong1		300

	switch(Massage_Knead.ActionCount)
	{
		case 0:
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 1)
			{
				BACK_SIDE_Surface_L_IN;
				CUSHION_L_IN;
			}
			else if(Massage_Knead.SupportTimeCount == diqidaiyuchong1)
			{
				BACK_SIDE_Surface_L_HOLD;
				CUSHION_L_HOLD;
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 1;
			}
			break;
		case 1:
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 1)
			{
				Massage_Stop_1(Valve_Point_7);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian1)
			{
				Massage_Mode_Set(MassageKnead_Action_7_1);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian1 + zhixingshijian1)
			{
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 2;
			}
			break;
		case 2:
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 1)
			{
				Massage_Stop_1(Valve_Point_9);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian1)
			{
				Massage_Mode_Set(MassageKnead_Action_7_2);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian1 + zhixingshijian1)
			{
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 3;
			}
			break;
		case 3:
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 1)
			{
				Massage_Stop_1(Valve_Point_11);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian1)
			{
				Massage_Mode_Set(MassageKnead_Action_7_3);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian1 + zhixingshijian1)
			{
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 4;
			}
			break;
		case 4:
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 1)
			{
				Massage_Stop_1(Valve_Point_9);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian)
			{
				Massage_Mode_Set(MassageKnead_Action_7_2);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian + zhixingshijian)
			{
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 5;
			}
			break;
		case 5:
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 1)
			{
				Massage_Stop_1(Valve_Point_8);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian)
			{
				Massage_Mode_Set(MassageKnead_Action_7_4);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian + zhixingshijian)
			{
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 6;
			}
			break;
		case 6:
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 1)
			{
				Massage_Stop_1(Valve_Point_10);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian)
			{
				Massage_Mode_Set(MassageKnead_Action_7_5);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian + zhixingshijian)
			{
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 7;
			}
			break;
		case 7:
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 1)
			{
				Massage_Stop_1(Valve_Point_12);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian)
			{
				Massage_Mode_Set(MassageKnead_Action_7_6);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian + zhixingshijian)
			{
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 8;
			}
			break;
		case 8:
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 1)
			{
				Massage_Stop_1(Valve_Point_10);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian)
			{
				Massage_Mode_Set(MassageKnead_Action_7_4);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian + zhixingshijian)
			{
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 1;
			}
			break;
	}
}

//小米双动揉捏筋膜枪
static void Massage_Knead_Process_4_2(void)
{
	#define yuchongshijian2		100
	#define zhixingshijian2		300
	#define diqidaiyuchong2		300

	switch(Massage_Knead.ActionCount)
	{
		case 0:
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 1)
			{
				BACK_SIDE_Surface_L_IN;
				CUSHION_L_IN;
			}
			else if(Massage_Knead.SupportTimeCount == diqidaiyuchong2)
			{
				BACK_SIDE_Surface_L_HOLD;
				CUSHION_L_HOLD;
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 1;
			}
			break;
		case 1:
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 1)
			{
				Massage_Stop_1(Valve_Point_7 | Valve_Point_8 | Valve_Point_9 | Valve_Point_10);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian2)
			{
				Massage_Mode_Set(MassageKnead_Action_7_7);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian2 + zhixingshijian2)
			{
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 2;
			}
			break;
		case 2:
#if 0
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 1)
			{
				Massage_Stop_1(Valve_Point_9 | Valve_Point_10 | Valve_Point_11 | Valve_Point_12);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian2)
			{
				Massage_Mode_Set(MassageKnead_Action_7_8);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian2 + zhixingshijian2)
			{
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 1;
			}
#endif
			break;
		case 3:
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 1)
			{
				Massage_Stop_1(Valve_Point_11 | Valve_Point_12);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian2)
			{
				Massage_Mode_Set(MassageKnead_Action_7_9);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian2 + zhixingshijian2)
			{
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 1;
			}
			break;
	}
}

//单滑背
static void Massage_Knead_Process_5(void)
{
	switch(Massage_Knead.ActionCount)
	{
		case 0:	//支撑气袋充气
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 1)
			{
				BACK_SIDE_Surface_L_IN;
				CUSHION_L_IN;
			}
			else if(Massage_Knead.SupportTimeCount == Massage_Knead.SupportTimeUp[Massage_Knead.Massage->Strength])
			{
				BACK_SIDE_Surface_L_HOLD;
				CUSHION_L_HOLD;
				Massage_Mode_Set(MassageKnead_Action_8);
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 1;
			}
			break;
		case 1:	//小气袋充气
			if(Massage.CurrAction == NULL)
			{

			}
			break;
	}
}

//理想L9双滑背
static void Massage_Knead_Process_6(void)
{
	switch(Massage_Knead.ActionCount)
	{
		case 0:	//支撑气袋充气
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 100)
			{
				BACK_SIDE_L_IN;
				BACK_SIDE_R_IN;
			}
			else if(Massage_Knead.SupportTimeCount == Massage_Knead.SupportTimeUp[Massage_Knead.Massage->Strength]+100)
			{
				BACK_SIDE_L_HOLD;
				BACK_SIDE_R_HOLD;
				Massage_Knead.ActionFlag = 1;
				Massage_Knead.ActionCount = 1;
				Massage_Knead.SupportTimeCount = 0;
			}
			break;
		case 1:
			Massage_Mode_Set(MassageKnead_Action_9);
			Massage_Knead.ActionCount = 2;
			break;
		case 2:
			if(Massage.CurrAction == NULL)
			{

			}
			break;
	}
}

//理想L9单滑背
static void Massage_Knead_Process_7(void)
{
	switch(Massage_Knead.ActionCount)
	{
		case 0:	//支撑气袋充气
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 100)
			{
				BACK_SIDE_L_IN;
				BACK_SIDE_R_IN;
			}
			else if(Massage_Knead.SupportTimeCount == Massage_Knead.SupportTimeUp[Massage_Knead.Massage->Strength]+100)
			{
				BACK_SIDE_L_HOLD;
				BACK_SIDE_R_HOLD;
				Massage_Knead.ActionFlag = 1;
				Massage_Knead.ActionCount = 1;
				Massage_Knead.SupportTimeCount = 0;
			}
			break;
		case 1:
			Massage_Mode_Set(MassageKnead_Action_10);
			Massage_Knead.ActionCount = 2;
			break;
		case 2:
			if(Massage.CurrAction == NULL)
			{

			}
			break;
	}
}

//理想L9背部指压
static void Massage_Knead_Process_8(void)
{
	switch(Massage_Knead.ActionCount)
	{
		case 0:	//支撑气袋充气
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 100)
			{
				BACK_SIDE_L_IN;
				BACK_SIDE_R_IN;
			}
			else if(Massage_Knead.SupportTimeCount == Massage_Knead.SupportTimeUp[Massage_Knead.Massage->Strength]+100)
			{
				BACK_SIDE_L_HOLD;
				BACK_SIDE_R_HOLD;
				Massage_Knead.ActionFlag = 1;
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 1;
			}
			break;
		case 1:
			Massage_Mode_Set(MassageKnead_Action_11);
			Massage_Knead.ActionCount = 2;
			break;
		case 2:
			if(Massage.CurrAction == NULL)
			{

			}
			break;
	}
}

//理想L9腰部筋膜枪
static void Massage_Knead_Process_9(void)
{
	#define yuchongshijian		100
	#define zhixingshijian		300

	switch(Massage_Knead.ActionCount)
	{
		case 0:
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 100)
			{
				BACK_SIDE_L_IN;
			}
			else if(Massage_Knead.SupportTimeCount == 300)
			{
				BACK_SIDE_L_HOLD;
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 1;
				Massage_Knead.ActionFlag = 1;
			}
			break;
		case 1:
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 1)
			{
				Massage_Stop_1(Valve_Point_9 | Valve_Point_8 | Valve_Point_11 | Valve_Point_12);
			}
			else if(Massage_Knead.SupportTimeCount == 70)
			{
				Massage_Mode_Set(MassageKnead_Action_23);
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 2;
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian + zhixingshijian)
			{

			}
			break;
		case 2:

			break;
	}
}

//理想L9肩部筋膜枪
static void Massage_Knead_Process_10(void)
{
	#define yuchongshijian		100
	#define zhixingshijian		300

	switch(Massage_Knead.ActionCount)
	{
		case 0:
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 100)
			{
				BACK_SIDE_R_IN;
			}
			else if(Massage_Knead.SupportTimeCount == Massage_Knead.SupportTimeUp[Massage_Knead.Massage->Strength]+200)
			{
				BACK_SIDE_R_HOLD;
				Massage_Knead.ActionFlag = 1;
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 1;
			}
			break;
		case 1:
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 1)
			{
				Massage_Stop_1(Valve_Point_2 | Valve_Point_3 | Valve_Point_5 | Valve_Point_6);
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian)
			{
				Massage_Mode_Set(MassageKnead_Action_15);
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 2;
			}
			else if(Massage_Knead.SupportTimeCount == yuchongshijian + zhixingshijian)
			{
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 2;
			}
			break;
		case 2:

			break;
	}
}

//理想L9靠背加强揉捏
static void Massage_Knead_Process_11(void)
{
	switch(Massage_Knead.ActionCount)
	{
		case 0:	//支撑气袋充气
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 100)
			{
				BACK_SIDE_R_IN;
			}
			else if(Massage_Knead.SupportTimeCount == Massage_Knead.SupportTimeUp[Massage_Knead.Massage->Strength]+100)
			{
				BACK_SIDE_R_HOLD;
				Massage_Knead.ActionFlag = 1;
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 1;
			//	Massage_Stop_1(Valve_Point_1 | Valve_Point_2 | Valve_Point_3 | \
			//					Valve_Point_4 | Valve_Point_5 | Valve_Point_6);
			}
			else if(Massage_Knead.SupportTimeCount == Massage_Knead.SupportTimeUp[Massage_Knead.Massage->Strength]+160)
			{

			}
			break;
		case 1:
			Massage_Mode_Set(MassageKnead_Action_12);
			Massage_Knead.SupportTimeCount = 0;
			Massage_Knead.ActionCount = 2;
			break;
		case 2:
			if(Massage.CurrAction == NULL)
			{
				BACK_SIDE_R_OUT;
				Massage_Knead.ActionCount = 3;
			}
			break;
		case 3:
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 100)
			{
				BACK_SIDE_L_IN;
			}
			else if(Massage_Knead.SupportTimeCount == Massage_Knead.SupportTimeUp[Massage_Knead.Massage->Strength]+100)
			{
				BACK_SIDE_L_HOLD;
				Massage_Mode_Set(MassageKnead_Action_13);
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 4;
			//	Massage_Stop_1(Valve_Point_7 | Valve_Point_8 | Valve_Point_9 | \
			//					Valve_Point_10 | Valve_Point_11 | Valve_Point_12);
			}
			else if(Massage_Knead.SupportTimeCount == Massage_Knead.SupportTimeUp[Massage_Knead.Massage->Strength]+160)
			{
				Massage_Mode_Set(MassageKnead_Action_13);
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 4;
			}
			break;
		case 4:
			if(Massage.CurrAction == NULL)
			{
				BACK_SIDE_L_OUT;
				Massage_Knead.ActionCount = 0;
			}
			break;
	}
}

//理想L9座部加强揉捏
static void Massage_Knead_Process_12(void)
{
	switch(Massage_Knead.ActionCount)
	{
		case 0:	//支撑气袋充气
			//Massage_Knead.SupportTimeCount++;
			//if(Massage_Knead.SupportTimeCount == 100)
			{
			//	Massage_Stop_1(Valve_Point_13 | Valve_Point_14 | Valve_Point_15 | \
			//					Valve_Point_16 | Valve_Point_17 | Valve_Point_18);
			}
			//else if(Massage_Knead.SupportTimeCount == 160)
			{
				Massage_Mode_Set(MassageKnead_Action_14);
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 1;
			}
			break;
		case 1:
			if(Massage.CurrAction == NULL)
			{

			}
			break;
	}
}


//理想L9全背揉捏
static void Massage_Knead_Process_13(void)
{
	switch(Massage_Knead.ActionCount)
	{
		case 0:	//支撑气袋充气
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 100)
			{
				BACK_SIDE_L_IN;
				BACK_SIDE_R_IN;
			}
			else if(Massage_Knead.SupportTimeCount == Massage_Knead.SupportTimeUp[Massage_Knead.Massage->Strength]+100)
			{
				BACK_SIDE_L_HOLD;
				BACK_SIDE_R_HOLD;
				Massage_Mode_Set(MassageKnead_Action_27);
				Massage_Knead.SupportTimeCount = 0;
				Massage_Knead.ActionCount = 1;
			}
			break;
		case 1:
			if(Massage.CurrAction == NULL)
			{

			}
			break;
	}
}

//捶腰
static void Massage_Knead_Process_14(void)
{
#define yuchongshijian		100
#define zhixingshijian		300

switch(Massage_Knead.ActionCount)
{
	case 0:
		Massage_Knead.SupportTimeCount++;
		if(Massage_Knead.SupportTimeCount == 100)
		{
			BACK_SIDE_L_IN;
		}
		else if(Massage_Knead.SupportTimeCount == 300)
		{
			BACK_SIDE_L_HOLD;
			Massage_Knead.SupportTimeCount = 0;
			Massage_Knead.ActionCount = 1;
			Massage_Knead.ActionFlag = 1;
		}
		break;
	case 1:
		Massage_Knead.SupportTimeCount++;
		if(Massage_Knead.SupportTimeCount == 1)
		{
			Massage_Stop_1(Valve_Point_9 | Valve_Point_8 | Valve_Point_11 | Valve_Point_12);
		}
		else if(Massage_Knead.SupportTimeCount == 70)
		{
			Massage_Mode_Set(MassageKnead_Action_28);
			Massage_Knead.SupportTimeCount = 0;
			Massage_Knead.ActionCount = 2;
		}
		else if(Massage_Knead.SupportTimeCount == yuchongshijian + zhixingshijian)
		{

		}
		break;
	case 2:

		break;
}
}


//558深度指压
static void Massage_Knead_Process_15(void)
{
	switch(Massage_Knead.ActionCount)
	{
		case 0:	//支撑气袋充气
			Massage_Mode_Set(MassageKnead_Action_29);
			Massage_Knead.SupportTimeCount = 0;
			Massage_Knead.ActionCount = 1;
			break;
		case 1:
			if(Massage.CurrAction == NULL)
			{

			}
			break;
	}
}


//按摩关闭
static void Massage_Knead_Process_off(void)
{
	switch(Massage_Knead.ActionCount)
	{
		case 0:	//支撑气袋充气
			Massage_Knead.SupportTimeCount++;
			if(Massage_Knead.SupportTimeCount == 1)
			{
				BACK_SIDE_L_OUT;
				BACK_SIDE_R_OUT
				//BACK_SIDE_Surface_L_OUT;
				//CUSHION_L_OUT;
			}
			else if(Massage_Knead.SupportTimeCount == 4000)
			{
				//BACK_SIDE_Surface_L_OUT;
				//CUSHION_L_OUT;
				//BACK_SIDE_Surface_L_HOLD;
				//CUSHION_L_HOLD;
				BACK_SIDE_L_HOLD;
				BACK_SIDE_R_HOLD;
				Massage_Knead.SupportTimeCount = 0;
				//Massage_Knead.ActionCount = 1;
				Massage_Knead.ActionFlag = 0;
			}
			break;
		case 1:	//小气袋充气
			//BACK_SIDE_Surface_L_OUT;
			//CUSHION_L_OUT;
			Massage_Knead.ActionCount = 0;
			Massage_Knead.SupportTimeCount = 0;
			Massage_Knead.Action_CB = NULL;
			break;
	}
}

/*
 * Valve.h
 *
 *  Created on: 2025年3月7日
 *      Author: mis
 */

#ifndef APP_CONTROL_VALVE_VALVE_H_
#define APP_CONTROL_VALVE_VALVE_H_

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>


/* Private define ------------------------------------------------------------*/
#define Massage_Knead_USE								//是否有揉捏按摩
#define Massage_ModeActionCount_Max			0x00		//按摩最大步骤数,按摩一直循环

#define Valve_Point_1		0x00000001
#define Valve_Point_2		0x00000002
#define Valve_Point_3		0x00000004
#define Valve_Point_4		0x00000008
#define Valve_Point_5		0x00000010
#define Valve_Point_6		0x00000020
#define Valve_Point_7		0x00000040
#define Valve_Point_8		0x00000080
#define Valve_Point_9		0x00000100
#define Valve_Point_10		0x00000200
#define Valve_Point_11		0x00000400
#define Valve_Point_12		0x00000800
#define Valve_Point_13		0x00001000
#define Valve_Point_14		0x00002000
#define Valve_Point_15		0x00004000
#define Valve_Point_16		0x00008000
#define Valve_Point_17		0x00010000
#define Valve_Point_18		0x00020000
#define Valve_Point_19		0x00040000
#define Valve_Point_20		0x00080000
#define Valve_Point_21		0x00100000
#define Valve_Point_22		0x00200000
#define Valve_Point_23		0x00400000
#define Valve_Point_24		0x00800000
#define Valve_Point_25		0x01000000
#define Valve_Point_26		0x02000000
#define Valve_Point_27		0x04000000
#define Valve_Point_28		0x08000000
#define Valve_Point_29		0x10000000
#define Valve_Point_30		0x20000000
#define Valve_Point_31		0x40000000
#define Valve_Point_32		0x80000000


/* Private typedef -----------------------------------------------------------*/
typedef void (*Action_Callback)(void);

typedef enum
{
	Massage_Infate = 0,			//按摩充气
	Massage_Leakage,			//按摩泄气
} Massage_State;

typedef enum
{
	Lumbar_Infate = 0,			//腰托充气
	Lumbar_Leakage,				//腰托泄气
	Lumbar_Keep,				//腰托保持
} Lumbar_State;

typedef enum
{
	BackWing_Start = 0,
	BackWing_Stop,
} Wing_State;

typedef enum
{
	Massage_Strength_1 = 0,		//按摩强度--500ms
	Massage_Strength_2,			//按摩强度--1000ms
	Massage_Strength_3,			//按摩强度--1500ms
	Massage_Strength_4,			//按摩强度--2000ms
	Massage_Strength_5,			//按摩强度--2500ms
	Massage_Strength_6,			//按摩强度--3000ms

	Massage_Strength_Max
} Massage_Strength;

typedef enum
{
	Wing_Strength_1 = 0,		//侧翼强度--500ms
	Wing_Strength_2,			//侧翼强度--800ms
	Wing_Strength_3,			//侧翼强度--1000ms
	Wing_Strength_4,			//侧翼强度--1200ms
	Wing_Strength_5,			//侧翼强度--1400ms
	Wing_Strength_6,			//侧翼强度--1600ms

	Wing_Strength_Max
} Wing_Strength;

typedef struct
{
	uint32_t Mapping;								//按摩阀体映射地址
	uint16_t AheadOPenTime[Massage_Strength_Max];	//按摩阀体提前开启时间
	uint16_t KeepTime[Massage_Strength_Max];		//按摩阀体保持时间
} Massage_Parameter;

typedef struct
{
	uint16_t ActionCount;							//执行步数
	uint16_t ActionStep;							//按摩模式动作步骤
	const Massage_Parameter *Parameter;				//按摩模式首地址
} Massage_Mode_TypeDef;

typedef enum
{
	Massage_Mode_1 = 0,								//传统按摩模式一:波浪
	Massage_Mode_2,									//传统按摩模式二:脉冲
	Massage_Mode_3,									//传统按摩模式三:猫步

	Massage_Mode_4,									//传统按摩模式四:单排
	Massage_Mode_5,									//传统按摩模式五:舒缓
	Massage_Mode_Max,

	MassageKnead_Action_1,							//揉捏
	MassageKnead_Action_2,							//双滑背
	MassageKnead_Action_3,							//伸展

	MassageKnead_Action_4_1,						//小米筋膜枪点1
	MassageKnead_Action_4_2,						//小米筋膜枪点2
	MassageKnead_Action_4,							//小米筋膜枪点3
	MassageKnead_Action_5,							//小米筋膜枪点4
	MassageKnead_Action_6,							//小米筋膜枪点5
	MassageKnead_Action_7,							//小米筋膜枪点6
	MassageKnead_Action_7_1,						//小米筋膜枪点7
	MassageKnead_Action_7_2,						//小米筋膜枪点8
	MassageKnead_Action_7_3,						//小米筋膜枪点9
	MassageKnead_Action_7_4,						//小米筋膜枪点10
	MassageKnead_Action_7_5,						//小米筋膜枪点11
	MassageKnead_Action_7_6,						//小米筋膜枪点12

	MassageKnead_Action_7_7,						//小米筋膜枪点10
	MassageKnead_Action_7_8,						//小米筋膜枪点11
	MassageKnead_Action_7_9,						//小米筋膜枪点12

	MassageKnead_Action_8,							//单滑背

	MassageKnead_Action_9,							//理想L9双滑背
	MassageKnead_Action_10,							//理想L9单滑背
	MassageKnead_Action_11,							//理想L9背部指压
	MassageKnead_Action_12,							//理想L9肩部揉捏
	MassageKnead_Action_13,							//理想L9腰部揉捏
	MassageKnead_Action_14,							//理想L9座部揉捏
	MassageKnead_Action_15,							//理想L9筋膜枪点1
	MassageKnead_Action_16,							//理想L9筋膜枪点2
	MassageKnead_Action_17,							//理想L9筋膜枪点3
	MassageKnead_Action_18,							//理想L9筋膜枪点4
	MassageKnead_Action_19,							//理想L9筋膜枪点5
	MassageKnead_Action_20,							//理想L9筋膜枪点6
	MassageKnead_Action_21,							//理想L9筋膜枪点7
	MassageKnead_Action_22,							//理想L9筋膜枪点8
	MassageKnead_Action_23,							//理想L9筋膜枪点9
	MassageKnead_Action_24,							//理想L9筋膜枪点10
	MassageKnead_Action_25,							//理想L9筋膜枪点11
	MassageKnead_Action_26,							//理想L9筋膜枪点12

	MassageKnead_Action_27,							//理想L9全背
	MassageKnead_Action_28,							//理想L9捶背

	MassageKnead_Action_29,							//558深度指压

	Massage_Knead_Action_Max,
} Massage_ModeTypeDef;

typedef enum
{
	MassageKnead_Mode_1,							//小米揉捏
	MassageKnead_Mode_2,							//小米单滑背
	MassageKnead_Mode_3,							//小米伸展
	MassageKnead_Mode_4,							//小米指压筋膜枪
	MassageKnead_Mode_4_1,							//小米揉捏筋膜枪
	MassageKnead_Mode_4_2,							//小米揉捏筋膜枪
	MassageKnead_Mode_5,							//小米双滑背

	MassageKnead_Mode_6,							//理想L9双滑背
	MassageKnead_Mode_7,							//理想L9单滑背
	MassageKnead_Mode_8,							//理想L9背部指压
	MassageKnead_Mode_9,							//理想L9腰部筋膜枪
	MassageKnead_Mode_10,							//理想L9肩部筋膜枪
	MassageKnead_Mode_11,							//理想L9靠背加强揉捏
	MassageKnead_Mode_12,							//理想L9坐垫加强揉捏

	MassageKnead_Mode_13,							//理想L9全身背部揉捏
	MassageKnead_Mode_14,							//理想L9捶腰

	MassageKnead_Mode_15,							//558深度指压

	MassageKnead_Mode_off,

	MassageKnead_Mode_Max
} MassageKnead_ModeTypeDef;

typedef enum
{
	BackWing_Left = 0,
	BackWing_Right,

	BackWing_None
} Wing_ModeTypeDef;

typedef struct
{
	const Massage_Mode_TypeDef *Mode;				//按摩模式
	const Massage_Parameter *CurrAction;			//当前按摩模式步骤
	const Massage_Parameter *NextAction;			//当前按摩模式下一个步骤

	uint8_t ID;										//当前按摩模式ID
	uint8_t ModeActionCount;

	const uint32_t KeepTime;						//按摩总时间
	uint16_t StepTime;								//当前按摩步骤时间计数
	uint32_t CurrTime;								//当前按摩总时间计数

	uint16_t ActionCount;							//当前按摩模式步骤计数
	uint16_t ActionNumber;							//当前按摩模式总步骤

	Massage_Strength Strength;						//按摩强度

	uint32_t ActionMapping;							//当前阀体动作映射
	uint32_t LastMapping;							//上一次阀体动作映射
} Massage_TypeDef;

typedef struct
{
	const uint16_t SupportTimeUp[Massage_Strength_Max];		//背部上支撑气袋充气时间
	const uint16_t KneadTimeUp[Massage_Strength_Max];		//背部小气袋充气时间

	uint16_t SupportTimeCount;								//支撑气袋充气时间计数
	uint16_t ActionCount;									//气袋运行周期

	uint8_t ActionFlag;

	Massage_TypeDef *Massage;								//揉捏气袋参数

	Action_Callback *Action_CB;								//揉捏模式执行回调函数
} Massage_Knead_TypeDef;

typedef struct
{
	const uint16_t InTimer[Wing_Strength_Max];				//侧翼充气时间
	const uint16_t OutTimer[Wing_Strength_Max];				//侧翼泄气时间
	uint16_t TimerCount;									//侧翼充泄气计数

	Wing_Strength Strength;									//侧翼充气强度
	Wing_ModeTypeDef ActionType;							//侧翼类型
	Wing_State State;										//侧翼状态
} BackWing_TypeDef;


/* Private function prototypes -----------------------------------------------*/
extern Massage_TypeDef Massage;

void Valve_MappingData_WriteList(uint32_t Data);
void Valve_MappingData_ReadList(uint32_t *Data);

void Massage_Mode_Set(uint8_t ID);
void MassageKnead_Mode_Set(uint8_t ID);
void Wing_Set(Wing_ModeTypeDef WingMode, Wing_State WingState);
void Massage_Stop(void);
void MassageKnead_Stop(void);
void Wing_Stop(void);
void Massage_Strength_Set(Massage_Strength Strength);
void Wing_StrengthSet(Wing_Strength Strength);

void BackWing_Process(void);
void Massage_Process(void);
extern void Valve_Action_Process(void);


#endif /* APP_CONTROL_VALVE_VALVE_H_ */
/*
 * ValveIf.c
 *
 *  Created on: 2025年3月7日
 *      Author: mis
 */


#include "..\Main\include.h"
#include <stddef.h>


#define Massage_Point_Mode				1		//0--十点按摩 1--6点按摩
#define Valve_Ctrl_Max					21

#if (Massage_Point_Mode == 0)
#define Massage_Mode1_AheadOpenTime			{5, 5, 5, 5, 5}
#define Massage_Mode1_KeepTime				{10, 15, 20, 25, 30}

#define Massage_Mode2_AheadOpenTime			{5, 5, 5, 5, 5}
#define Massage_Mode2_KeepTime				{10, 15, 20, 25, 30}

#define Massage_Mode3_AheadOpenTime			{5, 5, 5, 5, 5}
#define Massage_Mode3_KeepTime				{10, 15, 20, 25, 30}

#define Massage_Mode4_AheadOpenTime			{5, 5, 5, 5, 5}
#define Massage_Mode4_KeepTime				{10, 15, 20, 25, 30}

#define Massage_Mode5_AheadOpenTime			{5, 5, 5, 5, 5}
#define Massage_Mode5_KeepTime				{10, 15, 20, 25, 30}
#elif (Massage_Point_Mode == 1)
#define Massage_Mode1_AheadOpenTime			{0, 0, 0, 0, 0, 0}				//波浪模式
#define Massage_Mode1_KeepTime				{50, 100, 150, 200, 250, 300}

#define Massage_Mode2_AheadOpenTime			{0, 0, 0, 0, 0, 0}				//脉冲模式
#define Massage_Mode2_KeepTime				{50, 100, 150, 200, 250, 300}

#define Massage_Mode3_AheadOpenTime			{0, 50, 50, 50, 50, 50}			//猫步模式
#define Massage_Mode3_KeepTime				{50, 100, 150, 200, 250, 300}

#define Massage_Mode4_AheadOpenTime			{0, 50, 50, 50, 50, 50}
#define Massage_Mode4_KeepTime				{50, 100, 150, 200, 250, 300}

#define Massage_Mode5_AheadOpenTime			{0, 50, 50, 50, 50, 50}
#define Massage_Mode5_KeepTime				{50, 100, 150, 200, 250, 300}
#endif

#define MassgeKnead_SetNumber				6
#define MassageKnead_Mode1_AheadOpenTime	{2, 8, 11, 23, 5, 20}		//揉捏按摩时间参数
#define MassageKnead_Mode1_KeepTime			{20, 30, 40, 80, 90, 80}

#define MassageKnead_Mode2_AheadOpenTime	{0, 20, 30, 20, 20, 20}		//滑背按摩时间参数
#define MassageKnead_Mode2_KeepTime			{18, 50, 80, 90, 80, 80}
#define MassageKnead_Mode2_AheadOpenTime1	{8, 20, 30, 20, 20, 20}		//滑背揉捏按摩揉捏参数
#define MassageKnead_Mode2_KeepTime1		{18, 40, 60, 90, 80, 80}

#define MassageKnead_Mode3_AheadOpenTime	{8, 10, 23, 20, 20, 20}		//伸展按摩参数
#define MassageKnead_Mode3_KeepTime			{18, 40, 80, 80, 80, 80}

#define MassageKnead_Mode4_AheadOpenTime	{0, 20, 30, 20, 20, 20}		//伸展按摩拓展单元按摩参数
#define MassageKnead_Mode4_KeepTime			{18, 50, 80, 90, 80, 80}
#define MassageKnead_Mode4_AheadOpenTime1	{8, 20, 30, 20, 20, 20}		//伸展揉捏拓展参数
#define MassageKnead_Mode4_KeepTime1		{18, 40, 60, 90, 80, 80}

#define MassageGun_Mode1_AheadOpenTime		{0, 0, 0, 0, 0, 0}			//小米指压筋膜枪时间参数
#define MassageGun_Mode1_KeepTime			{5, 4, 3, 10, 10, 10}

#define MassageGun_Mode1_AheadOpenTime1		{0, 0, 0, 0, 0, 0}			//小米指压筋膜枪泄气时间参数
#define MassageGun_Mode1_KeepTime1			{8, 6, 5, 10, 10, 10}

#define MassageGun_Mode2_AheadOpenTime		{0, 0, 0, 0, 0, 0}			//小米揉捏筋膜枪时间参数
#define MassageGun_Mode2_KeepTime			{5, 4, 3, 10, 10, 10}

#define MassageGun_Mode2_AheadOpenTime1		{0, 0, 0, 0, 0, 0}			//小米揉捏筋膜枪泄气时间参数
#define MassageGun_Mode2_KeepTime1			{8, 6, 5, 10, 10, 10}

#define MassageGun_Mode3_AheadOpenTime		{0, 0, 0, 0, 0, 0}			//小米双揉捏筋膜枪时间参数
#define MassageGun_Mode3_KeepTime			{10, 7, 6, 10, 10, 10}

#define MassageGun_Mode3_AheadOpenTime1		{0, 0, 0, 0, 0, 0}			//小米双揉捏筋膜枪泄气时间参数
#define MassageGun_Mode3_KeepTime1			{3, 3, 2, 10, 10, 10}

#define MassageKnead_Mode5_AheadOpenTime	{8, 20, 30, 20, 20, 20}		//理想L9双滑背按摩时间参数
#define MassageKnead_Mode5_KeepTime			{18, 40, 60, 90, 80, 80}

#define MassageKnead_Mode6_AheadOpenTime	{8, 20, 30, 20, 20, 20}		//理想L9单滑背按摩时间参数
#define MassageKnead_Mode6_KeepTime			{18, 40, 60, 90, 80, 80}

#define MassageKnead_Mode7_AheadOpenTime	{0, 0, 0, 20, 20, 20}		//理想L9背部指压按摩时间参数
#define MassageKnead_Mode7_KeepTime			{100, 200, 300, 90, 80, 80}

#define MassageKnead_Mode8_AheadOpenTime	{6, 8, 11, 20, 20, 20}		//理想L9肩部揉捏按摩时间参数
#define MassageKnead_Mode8_KeepTime			{20, 30, 40, 90, 80, 80}

#define MassageKnead_Mode9_AheadOpenTime	{6, 8, 11, 20, 20, 20}		//理想L9腰部揉捏按摩时间参数
#define MassageKnead_Mode9_KeepTime			{20, 30, 40, 90, 80, 80}

#define MassageKnead_Mode10_AheadOpenTime	{6, 8, 11, 20, 20, 20}		//理想L9座部揉捏按摩时间参数
#define MassageKnead_Mode10_KeepTime		{20, 30, 40, 90, 80, 80}

#define MassageKnead_Mode11_AheadOpenTime	{0, 0, 0, 0, 0, 0}			//理想L9筋膜枪
#define MassageKnead_Mode11_KeepTime		{5, 7, 9, 10, 10, 10}

#define MassageKnead_Mode12_AheadOpenTime	{0, 0, 0, 0, 0, 0}			//理想L9--CE
#define MassageKnead_Mode12_KeepTime		{100, 100, 100, 10, 10, 10}

#define Massage_Mode6_AheadOpenTime			{0, 0, 0, 0, 0, 0}				//波浪模式
#define Massage_Mode6_KeepTime				{50, 100, 150, 200, 250, 300}

/* Private typedef -----------------------------------------------------------*/
//传统按摩
static const Massage_Parameter Massage_Para_Mode_1[] = 			//波浪按摩
{
	{.Mapping = Valve_Point_1 | Valve_Point_2, .AheadOPenTime = Massage_Mode1_AheadOpenTime, .KeepTime = Massage_Mode1_KeepTime},
	{.Mapping = Valve_Point_3 | Valve_Point_4, .AheadOPenTime = Massage_Mode1_AheadOpenTime, .KeepTime = Massage_Mode1_KeepTime},
	{.Mapping = Valve_Point_5 | Valve_Point_6, .AheadOPenTime = Massage_Mode1_AheadOpenTime, .KeepTime = Massage_Mode1_KeepTime},
	{.Mapping = Valve_Point_3 | Valve_Point_4, .AheadOPenTime = Massage_Mode1_AheadOpenTime, .KeepTime = Massage_Mode1_KeepTime},

	#if (Massage_Point_Mode == 0)
	{.Mapping = Valve_Point_7 | Valve_Point_8, .AheadOPenTime = Massage_Mode1_AheadOpenTime, .KeepTime = Massage_Mode1_KeepTime},
	{.Mapping = Valve_Point_9 | Valve_Point_10, .AheadOPenTime = Massage_Mode1_AheadOpenTime, .KeepTime = Massage_Mode1_KeepTime},
#endif
};

static const Massage_Parameter Massage_Para_Mode_2[] = 			//脉冲按摩
{
	{.Mapping = Valve_Point_1, .AheadOPenTime = Massage_Mode2_AheadOpenTime, .KeepTime = Massage_Mode2_KeepTime},
	{.Mapping = Valve_Point_2, .AheadOPenTime = Massage_Mode2_AheadOpenTime, .KeepTime = Massage_Mode2_KeepTime},
	{.Mapping = Valve_Point_3, .AheadOPenTime = Massage_Mode2_AheadOpenTime, .KeepTime = Massage_Mode2_KeepTime},
	{.Mapping = Valve_Point_4, .AheadOPenTime = Massage_Mode2_AheadOpenTime, .KeepTime = Massage_Mode2_KeepTime},
	{.Mapping = Valve_Point_5, .AheadOPenTime = Massage_Mode2_AheadOpenTime, .KeepTime = Massage_Mode2_KeepTime},
	{.Mapping = Valve_Point_6, .AheadOPenTime = Massage_Mode2_AheadOpenTime, .KeepTime = Massage_Mode2_KeepTime},
#if (Massage_Point_Mode == 0)
	{.Mapping = Valve_Point_7, .AheadOPenTime = Massage_Mode2_AheadOpenTime, .KeepTime = Massage_Mode2_KeepTime},
	{.Mapping = Valve_Point_8, .AheadOPenTime = Massage_Mode2_AheadOpenTime, .KeepTime = Massage_Mode2_KeepTime},
	{.Mapping = Valve_Point_9, .AheadOPenTime = Massage_Mode2_AheadOpenTime, .KeepTime = Massage_Mode2_KeepTime},
	{.Mapping = Valve_Point_10, .AheadOPenTime = Massage_Mode2_AheadOpenTime, .KeepTime = Massage_Mode2_KeepTime},
#endif
};

static const Massage_Parameter Massage_Para_Mode_3[] = 			//猫步按摩
{
	{.Mapping = Valve_Point_1 | Valve_Point_2, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_3 | Valve_Point_4, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_5 | Valve_Point_6, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
#if (Massage_Point_Mode == 0)
	{.Mapping = Valve_Point_7 | Valve_Point_8, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_9 | Valve_Point_10, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
#endif
	{.Mapping = Valve_Point_1 | Valve_Point_2, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_3 | Valve_Point_4, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_5 | Valve_Point_6, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
#if (Massage_Point_Mode == 0)
	{.Mapping = Valve_Point_7 | Valve_Point_8, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_9 | Valve_Point_10, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
#endif

	{.Mapping = Valve_Point_1 | Valve_Point_2, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_3 | Valve_Point_4, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_5 | Valve_Point_6, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
#if (Massage_Point_Mode == 0)
	{.Mapping = Valve_Point_7 | Valve_Point_8, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_9 | Valve_Point_10, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
#endif

	{.Mapping = Valve_Point_1, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_2, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_3, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_4, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_5, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_6, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
#if (Massage_Point_Mode == 0)
	{.Mapping = Valve_Point_7, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_8, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_9, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_10, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
#endif

	{.Mapping = Valve_Point_1, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_2, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_3, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_4, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_5, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_6, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
#if (Massage_Point_Mode == 0)
	{.Mapping = Valve_Point_7, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_8, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_9, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_10, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
#endif

	{.Mapping = Valve_Point_1, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_2, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_3, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_4, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_5, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_6, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
#if (Massage_Point_Mode == 0)
	{.Mapping = Valve_Point_7, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_8, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_9, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_10, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
#endif

	{.Mapping = Valve_Point_1 | Valve_Point_3, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_2 | Valve_Point_4, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_3 | Valve_Point_5, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_4 | Valve_Point_6, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
#if (Massage_Point_Mode == 0)
	{.Mapping = Valve_Point_5 | Valve_Point_7, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_6 | Valve_Point_8, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_7 | Valve_Point_9, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_8 | Valve_Point_10, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
#endif

	{.Mapping = Valve_Point_1 | Valve_Point_3, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_2 | Valve_Point_4, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_3 | Valve_Point_5, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_4 | Valve_Point_6, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
#if (Massage_Point_Mode == 0)
	{.Mapping = Valve_Point_5 | Valve_Point_7, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_6 | Valve_Point_8, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_7 | Valve_Point_9, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_8 | Valve_Point_10, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
#endif

	{.Mapping = Valve_Point_1 | Valve_Point_3, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_2 | Valve_Point_4, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_3 | Valve_Point_5, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_4 | Valve_Point_6, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
#if (Massage_Point_Mode == 0)
	{.Mapping = Valve_Point_5 | Valve_Point_7, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_6 | Valve_Point_8, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_7 | Valve_Point_9, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
	{.Mapping = Valve_Point_8 | Valve_Point_10, .AheadOPenTime = Massage_Mode3_AheadOpenTime, .KeepTime = Massage_Mode3_KeepTime},
#endif
};

static const Massage_Parameter Massage_Para_Mode_4[] = 			//单排按摩
{
	{.Mapping = Valve_Point_1 | Valve_Point_2, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_3 | Valve_Point_4, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_5 | Valve_Point_6, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},

	{.Mapping = Valve_Point_1 | Valve_Point_2, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_3 | Valve_Point_4, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_5 | Valve_Point_6, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},

	{.Mapping = Valve_Point_1 | Valve_Point_2, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_3 | Valve_Point_4, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_5 | Valve_Point_6, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},

	{.Mapping = Valve_Point_1, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_2, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_3, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_4, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_5, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_6, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},

	{.Mapping = Valve_Point_1, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_2, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_3, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_4, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_5, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_6, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},

	{.Mapping = Valve_Point_1, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_2, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_3, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_4, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_5, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_6, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},

	{.Mapping = Valve_Point_1 | Valve_Point_3, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_2 | Valve_Point_4, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_3 | Valve_Point_5, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_4 | Valve_Point_6, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},

	{.Mapping = Valve_Point_1 | Valve_Point_3, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_2 | Valve_Point_4, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_3 | Valve_Point_5, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_4 | Valve_Point_6, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},

	{.Mapping = Valve_Point_1 | Valve_Point_3, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_2 | Valve_Point_4, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_3 | Valve_Point_5, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
	{.Mapping = Valve_Point_4 | Valve_Point_6, .AheadOPenTime = Massage_Mode4_AheadOpenTime, .KeepTime = Massage_Mode4_KeepTime},
};

static const Massage_Parameter Massage_Para_Mode_5[] = 			//舒缓按摩
{
	{.Mapping = Valve_Point_7 | Valve_Point_8, .AheadOPenTime = Massage_Mode5_AheadOpenTime, .KeepTime = Massage_Mode5_KeepTime},
	{.Mapping = Valve_Point_9 | Valve_Point_10, .AheadOPenTime = Massage_Mode5_AheadOpenTime, .KeepTime = Massage_Mode5_KeepTime},
	{.Mapping = Valve_Point_5 | Valve_Point_6, .AheadOPenTime = Massage_Mode5_AheadOpenTime, .KeepTime = Massage_Mode5_KeepTime},

	{.Mapping = Valve_Point_7 | Valve_Point_8, .AheadOPenTime = Massage_Mode5_AheadOpenTime, .KeepTime = Massage_Mode5_KeepTime},
	{.Mapping = Valve_Point_9 | Valve_Point_10, .AheadOPenTime = Massage_Mode5_AheadOpenTime, .KeepTime = Massage_Mode5_KeepTime},
	{.Mapping = Valve_Point_5 | Valve_Point_6, .AheadOPenTime = Massage_Mode5_AheadOpenTime, .KeepTime = Massage_Mode5_KeepTime},

	{.Mapping = Valve_Point_7 | Valve_Point_8, .AheadOPenTime = Massage_Mode5_AheadOpenTime, .KeepTime = Massage_Mode5_KeepTime},
	{.Mapping = Valve_Point_9 | Valve_Point_10, .AheadOPenTime = Massage_Mode5_AheadOpenTime, .KeepTime = Massage_Mode5_KeepTime},
	{.Mapping = Valve_Point_5 | Valve_Point_6, .AheadOPenTime = Massage_Mode5_AheadOpenTime, .KeepTime = Massage_Mode5_KeepTime},

	{.Mapping = Valve_Point_7, .AheadOPenTime = Massage_Mode5_AheadOpenTime, .KeepTime = Massage_Mode5_KeepTime},
	{.Mapping = Valve_Point_8, .AheadOPenTime = Massage_Mode5_AheadOpenTime, .KeepTime = Massage_Mode5_KeepTime},
	{.Mapping = Valve_Point_9, .AheadOPenTime = Massage_Mode5_AheadOpenTime, .KeepTime = Massage_Mode5_KeepTime},
	{.Mapping = Valve_Point_10, .AheadOPenTime = Massage_Mode5_AheadOpenTime, .KeepTime = Massage_Mode5_KeepTime},

	{.Mapping = Valve_Point_7, .AheadOPenTime = Massage_Mode5_AheadOpenTime, .KeepTime = Massage_Mode5_KeepTime},
	{.Mapping = Valve_Point_8, .AheadOPenTime = Massage_Mode5_AheadOpenTime, .KeepTime = Massage_Mode5_KeepTime},
	{.Mapping = Valve_Point_9, .AheadOPenTime = Massage_Mode5_AheadOpenTime, .KeepTime = Massage_Mode5_KeepTime},
	{.Mapping = Valve_Point_10, .AheadOPenTime = Massage_Mode5_AheadOpenTime, .KeepTime = Massage_Mode5_KeepTime},

	{.Mapping = Valve_Point_7, .AheadOPenTime = Massage_Mode5_AheadOpenTime, .KeepTime = Massage_Mode5_KeepTime},
	{.Mapping = Valve_Point_8, .AheadOPenTime = Massage_Mode5_AheadOpenTime, .KeepTime = Massage_Mode5_KeepTime},
	{.Mapping = Valve_Point_9, .AheadOPenTime = Massage_Mode5_AheadOpenTime, .KeepTime = Massage_Mode5_KeepTime},
	{.Mapping = Valve_Point_10, .AheadOPenTime = Massage_Mode5_AheadOpenTime, .KeepTime = Massage_Mode5_KeepTime},

	{.Mapping = Valve_Point_7 | Valve_Point_9, .AheadOPenTime = Massage_Mode5_AheadOpenTime, .KeepTime = Massage_Mode5_KeepTime},
	{.Mapping = Valve_Point_8 | Valve_Point_10, .AheadOPenTime = Massage_Mode5_AheadOpenTime, .KeepTime = Massage_Mode5_KeepTime},

	{.Mapping = Valve_Point_7 | Valve_Point_9, .AheadOPenTime = Massage_Mode5_AheadOpenTime, .KeepTime = Massage_Mode5_KeepTime},
	{.Mapping = Valve_Point_8 | Valve_Point_10, .AheadOPenTime = Massage_Mode5_AheadOpenTime, .KeepTime = Massage_Mode5_KeepTime},

	{.Mapping = Valve_Point_7 | Valve_Point_9, .AheadOPenTime = Massage_Mode5_AheadOpenTime, .KeepTime = Massage_Mode5_KeepTime},
	{.Mapping = Valve_Point_8 | Valve_Point_10, .AheadOPenTime = Massage_Mode5_AheadOpenTime, .KeepTime = Massage_Mode5_KeepTime},
};

static const Massage_Parameter Massage_Para_Mode_6_1[] =
{
	{.Mapping = Valve_Point_1, .AheadOPenTime = MassageGun_Mode1_AheadOpenTime, .KeepTime = MassageGun_Mode1_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageGun_Mode1_AheadOpenTime1, .KeepTime = MassageGun_Mode1_KeepTime1},
};

static const Massage_Parameter Massage_Para_Mode_6_2[] =
{
	{.Mapping = Valve_Point_2, .AheadOPenTime = MassageGun_Mode1_AheadOpenTime, .KeepTime = MassageGun_Mode1_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageGun_Mode1_AheadOpenTime1, .KeepTime = MassageGun_Mode1_KeepTime1},
};

static const Massage_Parameter Massage_Para_Mode_6[] =
{
	{.Mapping = Valve_Point_3, .AheadOPenTime = MassageGun_Mode1_AheadOpenTime, .KeepTime = MassageGun_Mode1_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageGun_Mode1_AheadOpenTime1, .KeepTime = MassageGun_Mode1_KeepTime1},
};

static const Massage_Parameter Massage_Para_Mode_7[] =
{
	{.Mapping = Valve_Point_4, .AheadOPenTime = MassageGun_Mode1_AheadOpenTime, .KeepTime = MassageGun_Mode1_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageGun_Mode1_AheadOpenTime1, .KeepTime = MassageGun_Mode1_KeepTime1},
};

static const Massage_Parameter Massage_Para_Mode_8[] =
{
	{.Mapping = Valve_Point_5, .AheadOPenTime = MassageGun_Mode1_AheadOpenTime, .KeepTime = MassageGun_Mode1_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageGun_Mode1_AheadOpenTime1, .KeepTime = MassageGun_Mode1_KeepTime1},
};

static const Massage_Parameter Massage_Para_Mode_9[] =
{
	{.Mapping = Valve_Point_6, .AheadOPenTime = MassageGun_Mode1_AheadOpenTime, .KeepTime = MassageGun_Mode1_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageGun_Mode1_AheadOpenTime1, .KeepTime = MassageGun_Mode1_KeepTime1},
};

static const Massage_Parameter Massage_Para_Mode_9_1[] =
{
	{.Mapping = Valve_Point_7, .AheadOPenTime = MassageGun_Mode2_AheadOpenTime, .KeepTime = MassageGun_Mode2_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageGun_Mode2_AheadOpenTime1, .KeepTime = MassageGun_Mode2_KeepTime1},
};

static const Massage_Parameter Massage_Para_Mode_9_2[] =
{
	{.Mapping = Valve_Point_9, .AheadOPenTime = MassageGun_Mode2_AheadOpenTime, .KeepTime = MassageGun_Mode2_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageGun_Mode2_AheadOpenTime1, .KeepTime = MassageGun_Mode2_KeepTime1},
};

static const Massage_Parameter Massage_Para_Mode_9_3[] =
{
	{.Mapping = Valve_Point_11, .AheadOPenTime = MassageGun_Mode2_AheadOpenTime, .KeepTime = MassageGun_Mode2_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageGun_Mode2_AheadOpenTime1, .KeepTime = MassageGun_Mode2_KeepTime1},
};

static const Massage_Parameter Massage_Para_Mode_9_4[] =
{
	{.Mapping = Valve_Point_8, .AheadOPenTime = MassageGun_Mode2_AheadOpenTime, .KeepTime = MassageGun_Mode2_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageGun_Mode2_AheadOpenTime1, .KeepTime = MassageGun_Mode2_KeepTime1},
};

static const Massage_Parameter Massage_Para_Mode_9_5[] =
{
	{.Mapping = Valve_Point_10, .AheadOPenTime = MassageGun_Mode2_AheadOpenTime, .KeepTime = MassageGun_Mode2_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageGun_Mode2_AheadOpenTime1, .KeepTime = MassageGun_Mode2_KeepTime1},
};

static const Massage_Parameter Massage_Para_Mode_9_6[] =
{
	{.Mapping = Valve_Point_12, .AheadOPenTime = MassageGun_Mode2_AheadOpenTime, .KeepTime = MassageGun_Mode2_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageGun_Mode2_AheadOpenTime1, .KeepTime = MassageGun_Mode2_KeepTime1},
};

static const Massage_Parameter Massage_Para_Mode_9_7[] =
{
	{.Mapping = Valve_Point_7 | Valve_Point_8 | Valve_Point_9 | Valve_Point_10, .AheadOPenTime = MassageGun_Mode3_AheadOpenTime, .KeepTime = MassageGun_Mode3_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageGun_Mode3_AheadOpenTime1, .KeepTime = MassageGun_Mode3_KeepTime1},
};

static const Massage_Parameter Massage_Para_Mode_9_8[] =
{
	{.Mapping = Valve_Point_9 | Valve_Point_10 | Valve_Point_11 | Valve_Point_12, .AheadOPenTime = MassageGun_Mode3_AheadOpenTime, .KeepTime = MassageGun_Mode3_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageGun_Mode3_AheadOpenTime1, .KeepTime = MassageGun_Mode3_KeepTime1},
};

static const Massage_Parameter Massage_Para_Mode_9_9[] =
{
	{.Mapping = Valve_Point_11 | Valve_Point_12, .AheadOPenTime = MassageGun_Mode3_AheadOpenTime, .KeepTime = MassageGun_Mode3_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageGun_Mode3_AheadOpenTime1, .KeepTime = MassageGun_Mode3_KeepTime1},
};


//揉捏按摩
static const Massage_Parameter Massage_Para_Mode_Knead1[] = 	//揉捏
{
	{.Mapping = Valve_Point_7 | Valve_Point_8, .AheadOPenTime = MassageKnead_Mode1_AheadOpenTime, .KeepTime = MassageKnead_Mode1_KeepTime},
	{.Mapping = Valve_Point_9 | Valve_Point_10, .AheadOPenTime = MassageKnead_Mode1_AheadOpenTime, .KeepTime = MassageKnead_Mode1_KeepTime},
	{.Mapping = Valve_Point_11 | Valve_Point_12, .AheadOPenTime = MassageKnead_Mode1_AheadOpenTime, .KeepTime = MassageKnead_Mode1_KeepTime},
};

static const Massage_Parameter Massage_Para_Mode_Knead2[] = 	//双滑背
{
	{.Mapping = Valve_Point_1 | Valve_Point_2, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime, .KeepTime = MassageKnead_Mode2_KeepTime},
	{.Mapping = Valve_Point_3 | Valve_Point_4, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime, .KeepTime = MassageKnead_Mode2_KeepTime},
	{.Mapping = Valve_Point_5 | Valve_Point_6, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime, .KeepTime = {18, 50, 80, 90, 80, 80}},
	{.Mapping = Valve_Point_7 | Valve_Point_8, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime1, .KeepTime = MassageKnead_Mode2_KeepTime1},
	{.Mapping = Valve_Point_9 | Valve_Point_10, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime1, .KeepTime = MassageKnead_Mode2_KeepTime1},
	{.Mapping = Valve_Point_11 | Valve_Point_12, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime1, .KeepTime = MassageKnead_Mode2_KeepTime1},
	{.Mapping = Valve_Point_9 | Valve_Point_10, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime1, .KeepTime = MassageKnead_Mode2_KeepTime1},
	{.Mapping = Valve_Point_7 | Valve_Point_8, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime1, .KeepTime = MassageKnead_Mode2_KeepTime1},
	{.Mapping = Valve_Point_5 | Valve_Point_6, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime, .KeepTime = {18, 80, 80, 90, 80, 80}},
	{.Mapping = Valve_Point_3 | Valve_Point_4, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime, .KeepTime = MassageKnead_Mode2_KeepTime},

};

static const Massage_Parameter Massage_Para_Mode_Knead3[] = 	//伸展
{
	{.Mapping = Valve_Point_7 | Valve_Point_8 | Valve_Point_5 | Valve_Point_6, .AheadOPenTime = MassageKnead_Mode3_AheadOpenTime, .KeepTime = {18, 40, 300, 80, 80, 80}},
	{.Mapping = Valve_Point_9 | Valve_Point_10 | Valve_Point_3 | Valve_Point_4, .AheadOPenTime = {8, 5, 23, 20, 20, 20}, .KeepTime = {18, 40, 60, 80, 80, 80}},
	{.Mapping = Valve_Point_11 | Valve_Point_12 | Valve_Point_1 | Valve_Point_2, .AheadOPenTime = MassageKnead_Mode3_AheadOpenTime, .KeepTime = {18, 40, 300, 80, 80, 80}},
	{.Mapping = Valve_Point_9 | Valve_Point_10 | Valve_Point_3 | Valve_Point_4, .AheadOPenTime = {8, 5, 23, 20, 20, 20}, .KeepTime = {18, 40, 60, 80, 80, 80}},

};

static const Massage_Parameter Massage_Para_Mode_Knead4[] = 	//单滑背
{
	{.Mapping = Valve_Point_1, .AheadOPenTime = {10, 30, 40, 20, 20, 20}, .KeepTime = MassageKnead_Mode2_KeepTime},
	{.Mapping = Valve_Point_3, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime, .KeepTime = MassageKnead_Mode2_KeepTime},
	{.Mapping = Valve_Point_5, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime, .KeepTime = MassageKnead_Mode2_KeepTime},
	{.Mapping = Valve_Point_7, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime1, .KeepTime = MassageKnead_Mode2_KeepTime1},
	{.Mapping = Valve_Point_9, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime1, .KeepTime = MassageKnead_Mode2_KeepTime1},
	{.Mapping = Valve_Point_11, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime1, .KeepTime = MassageKnead_Mode2_KeepTime1},
	{.Mapping = Valve_Point_12, .AheadOPenTime = {10, 30, 40, 20, 20, 20}, .KeepTime = MassageKnead_Mode2_KeepTime1},
	{.Mapping = Valve_Point_10, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime, .KeepTime = MassageKnead_Mode2_KeepTime1},
	{.Mapping = Valve_Point_8, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime1, .KeepTime = MassageKnead_Mode2_KeepTime1},
	{.Mapping = Valve_Point_6, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime, .KeepTime = MassageKnead_Mode2_KeepTime},
	{.Mapping = Valve_Point_4, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime, .KeepTime = MassageKnead_Mode2_KeepTime},
	{.Mapping = Valve_Point_2, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime, .KeepTime = MassageKnead_Mode2_KeepTime},

#if 0
	{.Mapping = Valve_Point_1 | Valve_Point_2, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime, .KeepTime = MassageKnead_Mode2_KeepTime},
	{.Mapping = Valve_Point_3 | Valve_Point_4, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime, .KeepTime = MassageKnead_Mode2_KeepTime},
	{.Mapping = Valve_Point_5 | Valve_Point_6, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime, .KeepTime = MassageKnead_Mode2_KeepTime},
	{.Mapping = Valve_Point_7 | Valve_Point_8, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime1, .KeepTime = MassageKnead_Mode2_KeepTime1},
	{.Mapping = Valve_Point_9 | Valve_Point_10, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime1, .KeepTime = MassageKnead_Mode2_KeepTime1},
	{.Mapping = Valve_Point_11 | Valve_Point_12, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime1, .KeepTime = MassageKnead_Mode2_KeepTime1},
	{.Mapping = Valve_Point_9 | Valve_Point_10, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime1, .KeepTime = MassageKnead_Mode2_KeepTime1},
	{.Mapping = Valve_Point_7 | Valve_Point_8, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime1, .KeepTime = MassageKnead_Mode2_KeepTime1},
	{.Mapping = Valve_Point_5 | Valve_Point_6, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime, .KeepTime = MassageKnead_Mode2_KeepTime},
	{.Mapping = Valve_Point_3 | Valve_Point_4, .AheadOPenTime = MassageKnead_Mode2_AheadOpenTime, .KeepTime = MassageKnead_Mode2_KeepTime},
#endif
};

//理想L9双滑背
static const Massage_Parameter Massage_Para_Mode_Knead5[] =
{
#if 0
	{.Mapping = Valve_Point_1 | Valve_Point_4, .AheadOPenTime = MassageKnead_Mode5_AheadOpenTime, .KeepTime = MassageKnead_Mode5_KeepTime},
	{.Mapping = Valve_Point_3 | Valve_Point_6, .AheadOPenTime = MassageKnead_Mode5_AheadOpenTime, .KeepTime = MassageKnead_Mode5_KeepTime},
	{.Mapping = Valve_Point_7 | Valve_Point_10, .AheadOPenTime = MassageKnead_Mode5_AheadOpenTime, .KeepTime = MassageKnead_Mode5_KeepTime},
	{.Mapping = Valve_Point_9 | Valve_Point_12, .AheadOPenTime = MassageKnead_Mode5_AheadOpenTime, .KeepTime = {28, 50, 70, 90, 80, 80}},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = {35, 35, 35, 35, 10, 10}},
	{.Mapping = Valve_Point_2 | Valve_Point_5, .AheadOPenTime = MassageKnead_Mode5_AheadOpenTime, .KeepTime = MassageKnead_Mode5_KeepTime},
	{.Mapping = Valve_Point_3 | Valve_Point_6, .AheadOPenTime = MassageKnead_Mode5_AheadOpenTime, .KeepTime = MassageKnead_Mode5_KeepTime},
	{.Mapping = Valve_Point_7 | Valve_Point_10, .AheadOPenTime = MassageKnead_Mode5_AheadOpenTime, .KeepTime = MassageKnead_Mode5_KeepTime},
	{.Mapping = Valve_Point_9 | Valve_Point_12, .AheadOPenTime = MassageKnead_Mode5_AheadOpenTime, .KeepTime = {28, 50, 70, 90, 80, 80}},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = {35, 35, 35, 10, 10, 10}},
#endif
	{.Mapping = Valve_Point_1 | Valve_Point_4, .AheadOPenTime = MassageKnead_Mode5_AheadOpenTime, .KeepTime = MassageKnead_Mode5_KeepTime},
	{.Mapping = Valve_Point_2 | Valve_Point_5, .AheadOPenTime = MassageKnead_Mode5_AheadOpenTime, .KeepTime = MassageKnead_Mode5_KeepTime},
	{.Mapping = Valve_Point_3 | Valve_Point_6, .AheadOPenTime = MassageKnead_Mode5_AheadOpenTime, .KeepTime = MassageKnead_Mode5_KeepTime},
	{.Mapping = Valve_Point_7 | Valve_Point_10, .AheadOPenTime = MassageKnead_Mode5_AheadOpenTime, .KeepTime = MassageKnead_Mode5_KeepTime},
	{.Mapping = Valve_Point_8 | Valve_Point_11, .AheadOPenTime = MassageKnead_Mode5_AheadOpenTime, .KeepTime = MassageKnead_Mode5_KeepTime},
	{.Mapping = Valve_Point_9 | Valve_Point_12, .AheadOPenTime = MassageKnead_Mode5_AheadOpenTime, .KeepTime = MassageKnead_Mode5_KeepTime},
	{.Mapping = Valve_Point_8 | Valve_Point_11, .AheadOPenTime = MassageKnead_Mode5_AheadOpenTime, .KeepTime = MassageKnead_Mode5_KeepTime},
	{.Mapping = Valve_Point_7 | Valve_Point_10, .AheadOPenTime = MassageKnead_Mode5_AheadOpenTime, .KeepTime = MassageKnead_Mode5_KeepTime},
	{.Mapping = Valve_Point_3 | Valve_Point_6, .AheadOPenTime = MassageKnead_Mode5_AheadOpenTime, .KeepTime = MassageKnead_Mode5_KeepTime},
	{.Mapping = Valve_Point_2 | Valve_Point_5, .AheadOPenTime = MassageKnead_Mode5_AheadOpenTime, .KeepTime = MassageKnead_Mode5_KeepTime},
};

//理想L9单滑背
static const Massage_Parameter Massage_Para_Mode_Knead6[] =
{
	{.Mapping = Valve_Point_2, .AheadOPenTime = MassageKnead_Mode6_AheadOpenTime, .KeepTime = MassageKnead_Mode6_KeepTime},
	{.Mapping = Valve_Point_1, .AheadOPenTime = MassageKnead_Mode6_AheadOpenTime, .KeepTime = MassageKnead_Mode6_KeepTime},
	{.Mapping = Valve_Point_3, .AheadOPenTime = MassageKnead_Mode6_AheadOpenTime, .KeepTime = MassageKnead_Mode6_KeepTime},
	{.Mapping = Valve_Point_7, .AheadOPenTime = MassageKnead_Mode6_AheadOpenTime, .KeepTime = MassageKnead_Mode6_KeepTime},
	{.Mapping = Valve_Point_8, .AheadOPenTime = MassageKnead_Mode6_AheadOpenTime, .KeepTime = MassageKnead_Mode6_KeepTime},
	//{.Mapping = Valve_Point_9, .AheadOPenTime = MassageKnead_Mode6_AheadOpenTime, .KeepTime = MassageKnead_Mode6_KeepTime},
	//{.Mapping = Valve_Point_12, .AheadOPenTime = MassageKnead_Mode6_AheadOpenTime, .KeepTime = MassageKnead_Mode6_KeepTime},
	{.Mapping = Valve_Point_11, .AheadOPenTime = MassageKnead_Mode6_AheadOpenTime, .KeepTime = MassageKnead_Mode6_KeepTime},
	{.Mapping = Valve_Point_10, .AheadOPenTime = MassageKnead_Mode6_AheadOpenTime, .KeepTime = MassageKnead_Mode6_KeepTime},
	{.Mapping = Valve_Point_6, .AheadOPenTime = MassageKnead_Mode6_AheadOpenTime, .KeepTime = MassageKnead_Mode6_KeepTime},
	{.Mapping = Valve_Point_4, .AheadOPenTime = MassageKnead_Mode6_AheadOpenTime, .KeepTime = MassageKnead_Mode6_KeepTime},
	{.Mapping = Valve_Point_5, .AheadOPenTime = MassageKnead_Mode6_AheadOpenTime, .KeepTime = MassageKnead_Mode6_KeepTime},
};

//理想L9背部指压
static const Massage_Parameter Massage_Para_Mode_Knead7[] =
{
	{.Mapping = Valve_Point_1 | Valve_Point_4 | Valve_Point_7 | Valve_Point_10, .AheadOPenTime = MassageKnead_Mode7_AheadOpenTime, .KeepTime = MassageKnead_Mode7_KeepTime},
//	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageKnead_Mode12_AheadOpenTime, .KeepTime = MassageKnead_Mode12_KeepTime},
	{.Mapping = Valve_Point_3 | Valve_Point_6 | Valve_Point_9 | Valve_Point_12, .AheadOPenTime = MassageKnead_Mode7_AheadOpenTime, .KeepTime = MassageKnead_Mode7_KeepTime},
//	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageKnead_Mode12_AheadOpenTime, .KeepTime = MassageKnead_Mode12_KeepTime},
	{.Mapping = Valve_Point_2 | Valve_Point_5 | Valve_Point_8 | Valve_Point_11, .AheadOPenTime = MassageKnead_Mode7_AheadOpenTime, .KeepTime = MassageKnead_Mode7_KeepTime},
//	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageKnead_Mode12_AheadOpenTime, .KeepTime = MassageKnead_Mode12_KeepTime},
	//{.Mapping = Valve_Point_5 | Valve_Point_6, .AheadOPenTime = MassageKnead_Mode7_AheadOpenTime, .KeepTime = MassageKnead_Mode7_KeepTime},
//	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageKnead_Mode12_AheadOpenTime, .KeepTime = MassageKnead_Mode12_KeepTime},

//	{.Mapping = Valve_Point_3 | Valve_Point_6, .AheadOPenTime = MassageKnead_Mode7_AheadOpenTime, .KeepTime = MassageKnead_Mode7_KeepTime},
//	{.Mapping = Valve_Point_7 | Valve_Point_10, .AheadOPenTime = MassageKnead_Mode7_AheadOpenTime, .KeepTime = MassageKnead_Mode7_KeepTime},
//	{.Mapping = Valve_Point_9 | Valve_Point_12, .AheadOPenTime = MassageKnead_Mode7_AheadOpenTime, .KeepTime = MassageKnead_Mode7_KeepTime},
//	{.Mapping = Valve_Point_8 | Valve_Point_11, .AheadOPenTime = MassageKnead_Mode7_AheadOpenTime, .KeepTime = MassageKnead_Mode7_KeepTime},
//	{.Mapping = Valve_Point_3 | Valve_Point_6, .AheadOPenTime = MassageKnead_Mode7_AheadOpenTime, .KeepTime = MassageKnead_Mode7_KeepTime},
//	{.Mapping = Valve_Point_2 | Valve_Point_5, .AheadOPenTime = MassageKnead_Mode7_AheadOpenTime, .KeepTime = MassageKnead_Mode7_KeepTime},
};

//理想L9肩部揉捏
static const Massage_Parameter Massage_Para_Mode_Knead8[] =
{
	{.Mapping = Valve_Point_2 | Valve_Point_5, .AheadOPenTime = MassageKnead_Mode8_AheadOpenTime, .KeepTime = MassageKnead_Mode8_KeepTime},
	{.Mapping = Valve_Point_1 | Valve_Point_4, .AheadOPenTime = MassageKnead_Mode8_AheadOpenTime, .KeepTime = MassageKnead_Mode8_KeepTime},
	{.Mapping = Valve_Point_3 | Valve_Point_6, .AheadOPenTime = MassageKnead_Mode8_AheadOpenTime, .KeepTime = MassageKnead_Mode8_KeepTime},
};

//理想L9腰部揉捏
static const Massage_Parameter Massage_Para_Mode_Knead9[] =
{
	{.Mapping = Valve_Point_7 | Valve_Point_10, .AheadOPenTime = MassageKnead_Mode9_AheadOpenTime, .KeepTime = MassageKnead_Mode9_KeepTime},
	{.Mapping = Valve_Point_9 | Valve_Point_12, .AheadOPenTime = MassageKnead_Mode9_AheadOpenTime, .KeepTime = MassageKnead_Mode9_KeepTime},
	{.Mapping = Valve_Point_8 | Valve_Point_11, .AheadOPenTime = MassageKnead_Mode9_AheadOpenTime, .KeepTime = MassageKnead_Mode9_KeepTime},
};

//理想L9座部揉捏--预留
static const Massage_Parameter Massage_Para_Mode_Knead10[] =
{
	{.Mapping = Valve_Point_13 | Valve_Point_16, .AheadOPenTime = MassageKnead_Mode10_AheadOpenTime, .KeepTime = MassageKnead_Mode10_KeepTime},
	{.Mapping = Valve_Point_15 | Valve_Point_18, .AheadOPenTime = MassageKnead_Mode10_AheadOpenTime, .KeepTime = MassageKnead_Mode10_KeepTime},
	{.Mapping = Valve_Point_14 | Valve_Point_17, .AheadOPenTime = MassageKnead_Mode10_AheadOpenTime, .KeepTime = MassageKnead_Mode10_KeepTime},
};

//理想L9筋膜枪点1
static const Massage_Parameter Massage_Para_Mode_Knead11[] =
{
	{.Mapping = Valve_Point_2 | Valve_Point_3 | Valve_Point_5 | Valve_Point_6, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},
	//{.Mapping = Valve_Point_1 | Valve_Point_3 | Valve_Point_4 | Valve_Point_6, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},

	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},

};

//理想L9筋膜枪点2
static const Massage_Parameter Massage_Para_Mode_Knead12[] =
{
	{.Mapping = Valve_Point_2, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},
};

//理想L9筋膜枪点3
static const Massage_Parameter Massage_Para_Mode_Knead13[] =
{
	{.Mapping = Valve_Point_3, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},
};

//理想L9筋膜枪点4
static const Massage_Parameter Massage_Para_Mode_Knead14[] =
{
	{.Mapping = Valve_Point_4, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},
};

//理想L9筋膜枪点5
static const Massage_Parameter Massage_Para_Mode_Knead15[] =
{
	{.Mapping = Valve_Point_5, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},
};

//理想L9筋膜枪点6
static const Massage_Parameter Massage_Para_Mode_Knead16[] =
{
	{.Mapping = Valve_Point_6, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},
};

//理想L9筋膜枪点7
static const Massage_Parameter Massage_Para_Mode_Knead17[] =
{
	{.Mapping = Valve_Point_7, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},
};

//理想L9筋膜枪点8
static const Massage_Parameter Massage_Para_Mode_Knead18[] =
{
	{.Mapping = Valve_Point_8, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},
};

//理想L9筋膜枪点9
static const Massage_Parameter Massage_Para_Mode_Knead19[] =
{
	{.Mapping = Valve_Point_9 | Valve_Point_8 | Valve_Point_11 | Valve_Point_12, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},
};

//理想L9筋膜枪点10
static const Massage_Parameter Massage_Para_Mode_Knead20[] =
{
	{.Mapping = Valve_Point_10, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},
};

//理想L9筋膜枪点11
static const Massage_Parameter Massage_Para_Mode_Knead21[] =
{
	{.Mapping = Valve_Point_11, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},
};

//理想L9筋膜枪点12
static const Massage_Parameter Massage_Para_Mode_Knead22[] =
{
	{.Mapping = Valve_Point_12, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},
};

//理想L9全背揉捏
static const Massage_Parameter Massage_Para_Mode_Knead23[] =
{
	{.Mapping = Valve_Point_2 | Valve_Point_5 | Valve_Point_7 | Valve_Point_10, .AheadOPenTime = MassageKnead_Mode8_AheadOpenTime, .KeepTime = MassageKnead_Mode8_KeepTime},
	{.Mapping = Valve_Point_1 | Valve_Point_4 | Valve_Point_9 | Valve_Point_12, .AheadOPenTime = MassageKnead_Mode8_AheadOpenTime, .KeepTime = MassageKnead_Mode8_KeepTime},
	{.Mapping = Valve_Point_3 | Valve_Point_6 | Valve_Point_8 | Valve_Point_11, .AheadOPenTime = MassageKnead_Mode8_AheadOpenTime, .KeepTime = MassageKnead_Mode8_KeepTime},
};

//理想L9捶腰
static const Massage_Parameter Massage_Para_Mode_Knead24[] =
{
	{.Mapping = Valve_Point_9 | Valve_Point_8, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},
	{.Mapping = Valve_Point_11 | Valve_Point_12, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},
	{.Mapping = Valve_Point_32, .AheadOPenTime = MassageKnead_Mode11_AheadOpenTime, .KeepTime = MassageKnead_Mode11_KeepTime},
};

//558深度指压
static const Massage_Parameter Massage_Para_Mode_Knead25[] =
{
	{.Mapping = Valve_Point_1, .AheadOPenTime = Massage_Mode6_AheadOpenTime, .KeepTime = Massage_Mode6_KeepTime},
	{.Mapping = Valve_Point_2, .AheadOPenTime = Massage_Mode6_AheadOpenTime, .KeepTime = Massage_Mode6_KeepTime},
	{.Mapping = Valve_Point_3, .AheadOPenTime = Massage_Mode6_AheadOpenTime, .KeepTime = Massage_Mode6_KeepTime},
	{.Mapping = Valve_Point_4, .AheadOPenTime = Massage_Mode6_AheadOpenTime, .KeepTime = Massage_Mode6_KeepTime},
	{.Mapping = Valve_Point_5, .AheadOPenTime = Massage_Mode6_AheadOpenTime, .KeepTime = Massage_Mode6_KeepTime},
	{.Mapping = Valve_Point_6, .AheadOPenTime = Massage_Mode6_AheadOpenTime, .KeepTime = Massage_Mode6_KeepTime},
	{.Mapping = Valve_Point_7, .AheadOPenTime = Massage_Mode6_AheadOpenTime, .KeepTime = Massage_Mode6_KeepTime},
	{.Mapping = Valve_Point_8, .AheadOPenTime = Massage_Mode6_AheadOpenTime, .KeepTime = Massage_Mode6_KeepTime},
	{.Mapping = Valve_Point_9, .AheadOPenTime = Massage_Mode6_AheadOpenTime, .KeepTime = Massage_Mode6_KeepTime},
	{.Mapping = Valve_Point_10, .AheadOPenTime = Massage_Mode6_AheadOpenTime, .KeepTime = Massage_Mode6_KeepTime},
};

const Massage_Mode_TypeDef Massage_Mode[Massage_Knead_Action_Max] =
{
	[Massage_Mode_1] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_1)/sizeof(Massage_Para_Mode_1[0]), .Parameter = &Massage_Para_Mode_1[0]},
	[Massage_Mode_2] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_2)/sizeof(Massage_Para_Mode_2[0]), .Parameter = &Massage_Para_Mode_2[0]},
	[Massage_Mode_3] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_3)/sizeof(Massage_Para_Mode_3[0]), .Parameter = &Massage_Para_Mode_3[0]},

	[Massage_Mode_4] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_6)/sizeof(Massage_Para_Mode_6[0]), .Parameter = &Massage_Para_Mode_6[0]},
	[Massage_Mode_5] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_7)/sizeof(Massage_Para_Mode_7[0]), .Parameter = &Massage_Para_Mode_7[0]},

	[MassageKnead_Action_1] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_Knead1)/sizeof(Massage_Para_Mode_Knead1[0]), .Parameter = &Massage_Para_Mode_Knead1[0]},
	[MassageKnead_Action_2] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_Knead2)/sizeof(Massage_Para_Mode_Knead2[0]), .Parameter = &Massage_Para_Mode_Knead2[0]},
	[MassageKnead_Action_3] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_Knead3)/sizeof(Massage_Para_Mode_Knead3[0]), .Parameter = &Massage_Para_Mode_Knead3[0]},

	[MassageKnead_Action_4_1] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_6_1)/sizeof(Massage_Para_Mode_6_1[0]), .Parameter = &Massage_Para_Mode_6_1[0]},
	[MassageKnead_Action_4_2] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_6_2)/sizeof(Massage_Para_Mode_6_2[0]), .Parameter = &Massage_Para_Mode_6_2[0]},
	[MassageKnead_Action_4] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_6)/sizeof(Massage_Para_Mode_6[0]), .Parameter = &Massage_Para_Mode_6[0]},
	[MassageKnead_Action_5] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_7)/sizeof(Massage_Para_Mode_7[0]), .Parameter = &Massage_Para_Mode_7[0]},
	[MassageKnead_Action_6] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_8)/sizeof(Massage_Para_Mode_8[0]), .Parameter = &Massage_Para_Mode_8[0]},
	[MassageKnead_Action_7] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_9)/sizeof(Massage_Para_Mode_9[0]), .Parameter = &Massage_Para_Mode_9[0]},
	[MassageKnead_Action_7_1] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_9_1)/sizeof(Massage_Para_Mode_9_1[0]), .Parameter = &Massage_Para_Mode_9_1[0]},
	[MassageKnead_Action_7_2] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_9_2)/sizeof(Massage_Para_Mode_9_2[0]), .Parameter = &Massage_Para_Mode_9_2[0]},
	[MassageKnead_Action_7_3] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_9_3)/sizeof(Massage_Para_Mode_9_3[0]), .Parameter = &Massage_Para_Mode_9_3[0]},
	[MassageKnead_Action_7_4] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_9_4)/sizeof(Massage_Para_Mode_9_4[0]), .Parameter = &Massage_Para_Mode_9_4[0]},
	[MassageKnead_Action_7_5] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_9_5)/sizeof(Massage_Para_Mode_9_5[0]), .Parameter = &Massage_Para_Mode_9_5[0]},
	[MassageKnead_Action_7_6] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_9_6)/sizeof(Massage_Para_Mode_9_6[0]), .Parameter = &Massage_Para_Mode_9_6[0]},

	[MassageKnead_Action_7_7] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_9_7)/sizeof(Massage_Para_Mode_9_7[0]), .Parameter = &Massage_Para_Mode_9_7[0]},
	[MassageKnead_Action_7_8] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_9_8)/sizeof(Massage_Para_Mode_9_8[0]), .Parameter = &Massage_Para_Mode_9_8[0]},
	[MassageKnead_Action_7_9] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_9_9)/sizeof(Massage_Para_Mode_9_9[0]), .Parameter = &Massage_Para_Mode_9_9[0]},

	[MassageKnead_Action_8] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_Knead4)/sizeof(Massage_Para_Mode_Knead4[0]), .Parameter = &Massage_Para_Mode_Knead4[0]},

	//理想L9按摩模式, 分别为双滑背、单滑背、背部指压、肩部揉捏、腰部揉捏、座部揉捏、1-12筋膜枪气袋
	[MassageKnead_Action_9] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_Knead5)/sizeof(Massage_Para_Mode_Knead5[0]), .Parameter = &Massage_Para_Mode_Knead5[0]},
	[MassageKnead_Action_10] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_Knead6)/sizeof(Massage_Para_Mode_Knead6[0]), .Parameter = &Massage_Para_Mode_Knead6[0]},
	[MassageKnead_Action_11] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_Knead7)/sizeof(Massage_Para_Mode_Knead7[0]), .Parameter = &Massage_Para_Mode_Knead7[0]},

	[MassageKnead_Action_12] = {.ActionCount = 21, .ActionStep = sizeof(Massage_Para_Mode_Knead8)/sizeof(Massage_Para_Mode_Knead8[0]), .Parameter = &Massage_Para_Mode_Knead8[0]},
	[MassageKnead_Action_13] = {.ActionCount = 21, .ActionStep = sizeof(Massage_Para_Mode_Knead9)/sizeof(Massage_Para_Mode_Knead9[0]), .Parameter = &Massage_Para_Mode_Knead9[0]},
	[MassageKnead_Action_14] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_Knead10)/sizeof(Massage_Para_Mode_Knead10[0]), .Parameter = &Massage_Para_Mode_Knead10[0]},

	[MassageKnead_Action_15] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_Knead11)/sizeof(Massage_Para_Mode_Knead11[0]), .Parameter = &Massage_Para_Mode_Knead11[0]},
	[MassageKnead_Action_16] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_Knead12)/sizeof(Massage_Para_Mode_Knead12[0]), .Parameter = &Massage_Para_Mode_Knead12[0]},
	[MassageKnead_Action_17] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_Knead13)/sizeof(Massage_Para_Mode_Knead13[0]), .Parameter = &Massage_Para_Mode_Knead13[0]},
	[MassageKnead_Action_18] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_Knead14)/sizeof(Massage_Para_Mode_Knead14[0]), .Parameter = &Massage_Para_Mode_Knead14[0]},
	[MassageKnead_Action_19] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_Knead15)/sizeof(Massage_Para_Mode_Knead15[0]), .Parameter = &Massage_Para_Mode_Knead15[0]},
	[MassageKnead_Action_20] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_Knead16)/sizeof(Massage_Para_Mode_Knead16[0]), .Parameter = &Massage_Para_Mode_Knead16[0]},
	[MassageKnead_Action_21] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_Knead17)/sizeof(Massage_Para_Mode_Knead17[0]), .Parameter = &Massage_Para_Mode_Knead17[0]},
	[MassageKnead_Action_22] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_Knead18)/sizeof(Massage_Para_Mode_Knead18[0]), .Parameter = &Massage_Para_Mode_Knead18[0]},
	[MassageKnead_Action_23] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_Knead19)/sizeof(Massage_Para_Mode_Knead19[0]), .Parameter = &Massage_Para_Mode_Knead19[0]},
	[MassageKnead_Action_24] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_Knead20)/sizeof(Massage_Para_Mode_Knead20[0]), .Parameter = &Massage_Para_Mode_Knead20[0]},
	[MassageKnead_Action_25] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_Knead21)/sizeof(Massage_Para_Mode_Knead21[0]), .Parameter = &Massage_Para_Mode_Knead21[0]},
	[MassageKnead_Action_26] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_Knead22)/sizeof(Massage_Para_Mode_Knead22[0]), .Parameter = &Massage_Para_Mode_Knead22[0]},

	[MassageKnead_Action_27] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_Knead23)/sizeof(Massage_Para_Mode_Knead23[0]), .Parameter = &Massage_Para_Mode_Knead23[0]},
	[MassageKnead_Action_28] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_Knead24)/sizeof(Massage_Para_Mode_Knead24[0]), .Parameter = &Massage_Para_Mode_Knead24[0]},

	[MassageKnead_Action_29] = {.ActionCount = Massage_ModeActionCount_Max, .ActionStep = sizeof(Massage_Para_Mode_Knead25)/sizeof(Massage_Para_Mode_Knead25[0]), .Parameter = &Massage_Para_Mode_Knead25[0]},
};



//阀体映射地址动作回调函数
static void valve_ctrl_point_1(uint16_t Val);
static void valve_ctrl_point_2(uint16_t Val);
static void valve_ctrl_point_3(uint16_t Val);
static void valve_ctrl_point_4(uint16_t Val);
static void valve_ctrl_point_5(uint16_t Val);
static void valve_ctrl_point_6(uint16_t Val);
static void valve_ctrl_point_7(uint16_t Val);
static void valve_ctrl_point_8(uint16_t Val);
static void valve_ctrl_point_9(uint16_t Val);
static void valve_ctrl_point_10(uint16_t Val);
static void valve_ctrl_point_11(uint16_t Val);
static void valve_ctrl_point_12(uint16_t Val);
static void valve_ctrl_point_13(uint16_t Val);
static void valve_ctrl_point_14(uint16_t Val);
static void valve_ctrl_point_15(uint16_t Val);
static void valve_ctrl_point_16(uint16_t Val);
static void valve_ctrl_point_17(uint16_t Val);
static void valve_ctrl_point_18(uint16_t Val);
static void valve_ctrl_point_19(uint16_t Val);
static void valve_ctrl_point_20(uint16_t Val);

typedef void (*Vavle_Ctrl_Callback)(uint16_t Val);
static const Vavle_Ctrl_Callback ValveCtrl[] =
{
	[0] = valve_ctrl_point_1,			//按摩点位1,揉捏点位1
	[1] = valve_ctrl_point_2,			//按摩点位2,揉捏点位1
	[2] = valve_ctrl_point_3,			//按摩点位3,揉捏点位1
	[3] = valve_ctrl_point_4,			//按摩点位4,揉捏点位1
	[4] = valve_ctrl_point_5,			//按摩点位5,揉捏点位1
	[5] = valve_ctrl_point_6,			//按摩点位6,揉捏点位1
	[6] = valve_ctrl_point_7,			//按摩点位7,揉捏点位1

	[7] = valve_ctrl_point_8,			//按摩点位8,揉捏点位1
	[8] = valve_ctrl_point_9,			//按摩点位9,揉捏点位1
	[9] = valve_ctrl_point_10,			//按摩点位10,揉捏点位1
	[10] = valve_ctrl_point_11,
	[11] = valve_ctrl_point_12,
	[12] = valve_ctrl_point_13,
	[13] = valve_ctrl_point_14,
	[14] = valve_ctrl_point_15,
	[15] = valve_ctrl_point_16,
	[16] = valve_ctrl_point_17,
	[17] = valve_ctrl_point_18,
//	[18] = valve_ctrl_point_19,
//	[19] = valve_ctrl_point_20,
};


/* Private function prototypes -----------------------------------------------*/
/**
  * @brief  Valve_Action_Process -- 阀体动作
  * @param  none
  * @retval none
  */
void Valve_Action_Process(void)
{
	#define Valve_Open_Val		1
	#define Valve_Close_Val		0

	static uint32_t valve_data = 0;
	uint8_t i;

	Valve_MappingData_ReadList(&valve_data);
	if(valve_data == 0xFFFFFFFF)
	{
		return;
	}

	for(i = 0; i < sizeof(ValveCtrl)/sizeof(ValveCtrl[0]); i++)
	{
		if(ValveCtrl[i] == NULL)
		{
			continue;
		}

		if(valve_data & (1 << i))
		{
			//添加电磁阀爬坡算法。。。
			ValveCtrl[i](Valve_Open_Val);
		}
		else
		{
			ValveCtrl[i](Valve_Close_Val);
		}
	}
}


//电磁映射回调函数
static void valve_ctrl_point_1(uint16_t Val)
{
	PM.UC.L31 = Val;
}

static void valve_ctrl_point_2(uint16_t Val)
{
	PM.UC.L12 = Val;
}

static void valve_ctrl_point_3(uint16_t Val)
{
	PM.UC.L32 = Val;
}

static void valve_ctrl_point_4(uint16_t Val)
{
	PM.UC.L11 = Val;
}

static void valve_ctrl_point_5(uint16_t Val)
{
	PM.UC.L33 = Val;
}

static void valve_ctrl_point_6(uint16_t Val)
{
	PM.UC.L10 = Val;
}

static void valve_ctrl_point_7(uint16_t Val)
{
	PM.UC.L34 = Val;
}

static void valve_ctrl_point_8(uint16_t Val)
{
	PM.UC.L9 = Val;
}

static void valve_ctrl_point_9(uint16_t Val)
{
	PM.UC.L35 = Val;
}

static void valve_ctrl_point_10(uint16_t Val)
{
	PM.UC.L8 = Val;
}

static void valve_ctrl_point_11(uint16_t Val)
{
	PM.UC.L6 = Val;
}

static void valve_ctrl_point_12(uint16_t Val)
{
	PM.UC.L4 = Val;
}

static void valve_ctrl_point_13(uint16_t Val)
{
	PM.UC.L2 = Val;
}

static void valve_ctrl_point_14(uint16_t Val)
{
	PM.UC.L13 = Val;
}

static void valve_ctrl_point_15(uint16_t Val)
{
	PM.UC.L15 = Val;
}

static void valve_ctrl_point_16(uint16_t Val)
{
	PM.UC.L17 = Val;
}

static void valve_ctrl_point_17(uint16_t Val)
{
	PM.UC.L19 = Val;
}

static void valve_ctrl_point_18(uint16_t Val)
{
	PM.UC.L21 = Val;
}

static void valve_ctrl_point_19(uint16_t Val)
{
	//PM.UC.L21 = Val;
}

static void valve_ctrl_point_20(uint16_t Val)
{
	//PM.UC.L23 = Val;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值