From a8aabf3cc5e6efac20c830c8996d87c1b2c2dc33 Mon Sep 17 00:00:00 2001 From: zhouyanxu Date: Tue, 25 Apr 2023 10:41:19 +0800 Subject: [PATCH] add EnablePrimitiveEffect interfaece Signed-off-by: zhouyanxu --- .../vibrator/driver/include/vibrator_driver.h | 2 + .../driver/include/vibrator_driver_type.h | 3 + .../vibrator/driver/src/vibrator_driver.c | 64 ++++++++++++++++++- .../vibrator/driver/src/vibrator_parser.c | 6 +- 4 files changed, 70 insertions(+), 5 deletions(-) diff --git a/framework/model/misc/vibrator/driver/include/vibrator_driver.h b/framework/model/misc/vibrator/driver/include/vibrator_driver.h index b4199d083..9668d1756 100644 --- a/framework/model/misc/vibrator/driver/include/vibrator_driver.h +++ b/framework/model/misc/vibrator/driver/include/vibrator_driver.h @@ -18,6 +18,8 @@ struct VibratorOps { int32_t (*Start)(void); int32_t (*Stop)(void); + int32_t (*SetEffectId)(uint8_t effectId); + int32_t (*EnablePrimitiveEffect)(void); int32_t (*StartEffect)(uint32_t effectType); int32_t (*SetParameter)(uint16_t intensity, int16_t frequency); }; diff --git a/framework/model/misc/vibrator/driver/include/vibrator_driver_type.h b/framework/model/misc/vibrator/driver/include/vibrator_driver_type.h index da6ac7c5b..c237072e0 100644 --- a/framework/model/misc/vibrator/driver/include/vibrator_driver_type.h +++ b/framework/model/misc/vibrator/driver/include/vibrator_driver_type.h @@ -43,11 +43,13 @@ enum VibratorState { VIBRATOR_STATE_START_TIMER = 1, VIBRATOR_STATE_STOP = 2, VIBRATOR_STATE_SET_EFFECT = 3, + VIBRATOR_STATE_PRIMITIVE_EFFECT = 4, }; enum VibratorConfigMode { VIBRATOR_MODE_ONCE = 0, // The mode of a one-shot vibration effect. VIBRATOR_MODE_PRESET = 1, // The mode of a preset vibration effect. + VIBRATOR_MODE_PRIMITIVE_EFFECT = 2, // The mode of a primitive vibration effect. VIBRATOR_MODE_BUTT = 0XFF, }; @@ -57,6 +59,7 @@ enum VibratorDrvIoCmd { VIBRATOR_DRV_IO_STOP = 2, VIBRATOR_DRV_IO_GET_INFO = 3, VIBRATOR_DRV_IO_ENABLE_MODULATION_PARAMETER = 4, + VIBRATOR_DRV_IO_ENABLE_PRIMITIVE_EFFECT = 5, VIBRATOR_DRV_IO_END, }; diff --git a/framework/model/misc/vibrator/driver/src/vibrator_driver.c b/framework/model/misc/vibrator/driver/src/vibrator_driver.c index 2eac1ef8c..855d1d861 100644 --- a/framework/model/misc/vibrator/driver/src/vibrator_driver.c +++ b/framework/model/misc/vibrator/driver/src/vibrator_driver.c @@ -17,6 +17,7 @@ #define VIBRATOR_WORK_QUEUE_NAME "vibrator_queue" #define VIBRATOR_START_TIME 10 +#define PRIMITIVE_VIBRATION_DURATION 20 struct VibratorDriverData *g_vibratorDrvData = NULL; @@ -37,6 +38,8 @@ int32_t RegisterVibratorOps(struct VibratorOps *ops) drvData->ops.StartEffect = ops->StartEffect; drvData->ops.Stop = ops->Stop; drvData->ops.SetParameter = ops->SetParameter; + drvData->ops.SetEffectId = ops->SetEffectId; + drvData->ops.EnablePrimitiveEffect = ops->EnablePrimitiveEffect; (void)OsalMutexUnlock(&drvData->mutex); return HDF_SUCCESS; @@ -66,7 +69,12 @@ void StartVibrator(void) CHECK_VIBRATOR_NULL_PTR_RETURN(drvData); - drvData->state = VIBRATOR_STATE_START_TIMER; + if (drvData->mode == VIBRATOR_MODE_ONCE) { + drvData->state = VIBRATOR_STATE_START_TIMER; + } else if (drvData->mode == VIBRATOR_MODE_PRIMITIVE_EFFECT) { + drvData->state = VIBRATOR_STATE_PRIMITIVE_EFFECT; + } + HdfAddWork(&drvData->workQueue, &drvData->work); } @@ -104,6 +112,7 @@ static void VibratorWorkEntry(void *para) CHECK_VIBRATOR_NULL_PTR_RETURN(drvData); CHECK_VIBRATOR_NULL_PTR_RETURN(drvData->ops.Start); CHECK_VIBRATOR_NULL_PTR_RETURN(drvData->ops.Stop); + CHECK_VIBRATOR_NULL_PTR_RETURN(drvData->ops.EnablePrimitiveEffect); if (drvData->state == VIBRATOR_STATE_START_TIMER) { ret = drvData->ops.Start(); @@ -112,6 +121,13 @@ static void VibratorWorkEntry(void *para) } } + if (drvData->state == VIBRATOR_STATE_PRIMITIVE_EFFECT) { + ret = drvData->ops.EnablePrimitiveEffect(); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: add vibrator work fail! device state[%d]!", __func__, drvData->state); + } + } + if (drvData->state == VIBRATOR_STATE_STOP) { ret = drvData->ops.Stop(); if (ret != HDF_SUCCESS) { @@ -313,12 +329,58 @@ static int32_t EnableModulationParameter(struct HdfSBuf *data, struct HdfSBuf *r return HDF_SUCCESS; } + +static int32_t EnablePrimitiveEffect(struct HdfSBuf *data, struct HdfSBuf *reply) +{ + int32_t ret; + uint8_t effectId; + struct VibratorEffectCfg config; + struct VibratorDriverData *drvData = GetVibratorDrvData(); + (void)reply; + + CHECK_VIBRATOR_NULL_PTR_RETURN_VALUE(data, HDF_FAILURE); + CHECK_VIBRATOR_NULL_PTR_RETURN_VALUE(drvData, HDF_FAILURE); + + if (!HdfSbufReadUint8(data, &effectId)) { + HDF_LOGE("%s: sbuf read effect failed!", __func__); + return HDF_FAILURE; + } + + if (effectId == 0) { + HDF_LOGE("%s: effect ID invalid para!", __func__); + return HDF_ERR_INVALID_PARAM; + } + + if (drvData->mode != VIBRATOR_MODE_BUTT) { + HDF_LOGI("%s: vibrater haptic is busy now, please stop first!", __func__); + return HDF_ERR_DEVICE_BUSY; + } + + (void)OsalMutexLock(&drvData->mutex); + drvData->mode = VIBRATOR_MODE_PRIMITIVE_EFFECT; + (void)OsalMutexUnlock(&drvData->mutex); + + ret = drvData->ops.SetEffectId(effectId); + + config.cfgMode = VIBRATOR_MODE_ONCE; + config.duration = PRIMITIVE_VIBRATION_DURATION; + config.effect = NULL; + + ret = StartHaptic(&config); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: start haptic failed!", __func__); + return ret; + } + return HDF_SUCCESS; +} + static struct VibratorCmdHandleList g_vibratorCmdHandle[] = { {VIBRATOR_DRV_IO_START_ONCE, StartOnce}, {VIBRATOR_DRV_IO_START_PRESET, StartEffect}, {VIBRATOR_DRV_IO_STOP, Stop}, {VIBRATOR_DRV_IO_GET_INFO, GetVibratorInfo}, {VIBRATOR_DRV_IO_ENABLE_MODULATION_PARAMETER, EnableModulationParameter}, + {VIBRATOR_DRV_IO_ENABLE_PRIMITIVE_EFFECT, EnablePrimitiveEffect}, }; static int32_t DispatchVibrator(struct HdfDeviceIoClient *client, diff --git a/framework/model/misc/vibrator/driver/src/vibrator_parser.c b/framework/model/misc/vibrator/driver/src/vibrator_parser.c index c233e15c5..3ca9a4d03 100755 --- a/framework/model/misc/vibrator/driver/src/vibrator_parser.c +++ b/framework/model/misc/vibrator/driver/src/vibrator_parser.c @@ -40,10 +40,8 @@ static int32_t ParseVibratorInfo(struct DeviceResourceIface *parser, const struc CHECK_VIBRATOR_NULL_PTR_RETURN_VALUE(infoNode, HDF_ERR_INVALID_PARAM); CHECK_VIBRATOR_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM); - ret = parser->GetBool(infoNode, "isSupportIntensity"); - CHECK_VIBRATOR_PARSER_RESULT_RETURN_VALUE(ret, "isSupportIntensity"); - ret = parser->GetBool(infoNode, "isSupportFrequency"); - CHECK_VIBRATOR_PARSER_RESULT_RETURN_VALUE(ret, "isSupportFrequency"); + config->vibratorInfo.isSupportIntensity = parser->GetBool(infoNode, "isSupportIntensity"); + config->vibratorInfo.isSupportFrequency = parser->GetBool(infoNode, "isSupportFrequency"); ret = parser->GetUint16(infoNode, "intensityMaxValue", (uint16_t *)&config->vibratorInfo.intensityMaxValue, 0); CHECK_VIBRATOR_PARSER_RESULT_RETURN_VALUE(ret, "intensityMaxValue"); ret = parser->GetUint16(infoNode, "intensityMinValue", (uint16_t *)&config->vibratorInfo.intensityMinValue, 0); -- Gitee