#星计划#梅科尔工作室HOS-断指康复评估应用 原创

梅科尔李新怡
发布于 2024-1-26 23:41
浏览
0收藏

1 前言

1.1 主要使用功能

  我们基于OpenHarmony开发一个专门的应用端来帮助断指患者更好地管理康复过程。将传感器与手指义肢相结合,通过传感器可以感知手指的移动和受力情况,并将这些信息传递给手指义肢控制系统,从而实现更加精准的控制和响应,患者可以在开发的应用端上实时观测到手势的识别结果,我们旨在为断指患者提供全面的康复辅助和健康管理。

1.2 运行环境

  开发环境准备:

  DevEco Studio版本:DevEco Studio 3.1.1 Release及以上版本。

  OpenHarmony SDK版本:API 9,OpenHarmony3.2 Release

1.3 前期准备

  DAYU200硬件了解,固件下载更新烧录。

  可以参考:​​https://bbs.huaweicloud.com/blogs/381452​

#星计划#梅科尔工作室HOS-断指康复评估应用-鸿蒙开发者社区

图1 烧录固件

  在DevEco Studio上改为OpenHarmony开发模式并完成签名,这样我们就可以开始开发啦。


#星计划#梅科尔工作室HOS-断指康复评估应用-鸿蒙开发者社区

图2 更改模式

  注意:需要下载一下OpenHarmony的SDK:

#星计划#梅科尔工作室HOS-断指康复评估应用-鸿蒙开发者社区

图3 下载SDK

  不要忘了签名:

#星计划#梅科尔工作室HOS-断指康复评估应用-鸿蒙开发者社区

图4 应用签名

2 UI设计

2.1 修改昵称

  在前端应用中创建一个弹窗元素,包括一个文本输入框、一段文字、以及两个按钮,用于实现修改昵称的功能。


#星计划#梅科尔工作室HOS-断指康复评估应用-鸿蒙开发者社区

图5 修改昵称

// 设置文本 '更换昵称' 的字体大小为 20,上下边距分别为 10
Text('更换昵称').fontSize(20).margin({ top: 10, bottom: 10 })
// 创建一个文本输入框,设置占位符为空,文本为 this.textValue,高度为 60,宽度为 '90%'
TextInput({ placeholder: '', text: this.textValue }).height(60).width('90%')
// 当文本输入框的值发生变化时,触发 onChange 事件,将新值赋给 this.textValue
.onChange((value: string) => {
  this.textValue = value
})
// 设置文本 '是否更换?' 的字体大小为 16,上下边距分别为 10
Text('是否更换?').fontSize(16).margin({ top:10, bottom: 10 })
// 创建一个 Flex 容器,设置主轴对齐方式为 SpaceAround
Flex({ justifyContent: FlexAlign.SpaceAround }) {
  // 创建一个按钮 '更换',点击按钮时执行以下操作:
  Button('更换')
    .onClick(() => {
      // 将文本输入框的值赋给 this.inputValue
      this.inputValue = this.textValue
      // 关闭控制器
      this.controller.close()
      // 执行确认操作
      this.confirm()
    })
    // 设置按钮背景颜色为白色,字体颜色为红色
    .backgroundColor(0xffffff).fontColor(Color.Red)
}

  然后设置修改,这段代码片段整体上是在组件中声明了一些状态和回调函数,然后使用这些状态和回调函数创建了一个自定义对话框控制器,以实现对话框的定制和交互。

// 声明状态变量 textValue,初始化为空字符串
@State textValue: string = ''
// 声明状态变量 inputValue,初始化为 '昵称'
@State inputValue: string = '昵称'
// 创建一个自定义对话框控制器,使用 CustomDialogController 类,传入配置参数
dialogController: CustomDialogController = new CustomDialogController({
  // 使用 CustomDialogExample 作为对话框的构建器,配置取消和确认的回调函数,以及关联状态变量
  builder: CustomDialogExample({
    cancel: this.onCancel,
    confirm: this.onAccept,
    textValue: $textValue,
    inputValue: $inputValue
  }),
  // 配置取消对话框时的回调函数
  cancel: this.existApp,
  // 设置自动取消为 true
  autoCancel: true,
  // 配置对话框的对齐方式为默认
  alignment: DialogAlignment.Default,
  // 设置偏移量为 { dx: 0, dy: -20 }
  offset: { dx: 0, dy: -20 },
  // 配置网格数量为 4
  gridCount: 4,
  // 禁用自定义样式
  customStyle: false
})
// 定义 aboutToDisappear 方法
aboutToDisappear() {
  // 删除当前对话框控制器
  delete this.dialogController,
  // 将对话框控制器设置为 undefined
  this.dialogController = undefined
}

2.2 信息选择

  创建一个按钮,当点击按钮时,弹出一个文本选择对话框,用户可以从中选择伤残类型。选择的结果会通过回调函数进行处理。

#星计划#梅科尔工作室HOS-断指康复评估应用-鸿蒙开发者社区

图6 信息选择

// 创建一个按钮 "伤残类型",设置外边距为 20,点击按钮时执行以下操作
Button("伤残类型")
  .margin(20)
  .onClick(() => {
    // 显示文本选择对话框,配置范围为 this.shangcanage
   TextPickerDialog.show({
      range: this.shangcanage,
      // 确认选择时执行的回调函数,将选择的索引赋给 this.select1
      onAccept: (value: TextPickerResult) => {
        this.select1 = value.index
        console.info("TextPickerDialog:onAccept()" + JSON.stringify(value))
      },
      // 取消选择时执行的回调函数
      onCancel: () => {
        console.info("TextPickerDialog:onCancel()")
      },
 
      // 选择变化时执行的回调函数
      onChange: (value: TextPickerResult) => {
        console.info("TextPickerDialog:onChange()" + JSON.stringify(value))
      }
      })
  })

2.3 康复评估

  创建一个HTTP请求对象,定义了请求的URL,使用request方法发起HTTP请求,指定了请求方法为POST,设置请求头为JSON格式。

  在请求的extraData中包含了一些参数,需要根据实际情况传递有效的数据。在请求回调函数中,处理请求成功和失败的情况。如果返回的结果是'测试成功',则显示提示信息;否则,显示账户密码错误的提示信息。最后,根据请求的结果进行相应的处理,包括日志输出和提示信息。

#星计划#梅科尔工作室HOS-断指康复评估应用-鸿蒙开发者社区

图7 康复评估

// 定义 S_login 方法
S_login() {
  // 创建一个 HTTP 请求对象
  let httpRequest = http.createHttp();
  // 设置请求的 URL
  let url = "https://aip.baidubce.com/rpc/2.0/ai_custom_bml/v1/table_infer/emg_finger?access_token=24.a96f9a18bc0298ca1f07dbd8b5b63945.2592000.1694417034.282335-37576462"
  // 发起 HTTP 请求,这里使用云端训练好的模型进行识别
  httpRequest.request(
    url,
    {
      method: http.RequestMethod.POST,
      // 设置请求头信息,指定 Content-Type 为 application/json
      header: {
        'Content-Type': 'application/json'
      },
      // 设置请求的额外数据,包括 include_req 和 data 字段
      extraData: {
        "include_req": false,
        "data": [{
          // 数据的具体字段,这里只展示了一个示例字段,实际数据可能包含更多字段
          "col0": 0.046904,
          "col1": 0.03827,
          "col2": 0.027714,
          // ... 其他字段
          "col79": 1
        }]
      },
      // 设置连接超时时间为 6000 毫秒
      connectTimeout: 6000,
      // 设置读取超时时间为 6000 毫秒
      readTimeout: 6000,
    }
  );
}

  手势识别界面,包括显示手势识别标题、提示信息,以及一个包含图像动画和控制按钮的界面。用户可以通过按钮控制动画的播放、暂停、结束,并设置撤销、播放次数等参数。图像动画通过ImageAnimator组件实现,根据按钮的点击事件改变动画状态和参数。

// 显示文本 "手势识别"
Text("手势识别")
// 显示文本 "请根据下面顺序依次做动作"
Text("请根据下面顺序依次做动作")
// 创建一个垂直列,设置子元素间的垂直间隔为 20
Column({ space: 20 }) {
  // 显示一个图像动画,设置动画帧的图片来源
  ImageAnimator()
    .images([
      {
        src: $r('app.media.shoushi7')
      },
      {
        src: $r('app.media.shoushi6')
      }
    ])

  // 创建一个水平行

  Row() {
    // 创建一个按钮 '开始',设置宽度为 100,内边距为 5,点击按钮时执行状态切换为 Running
    Button('开始').width(100).padding(5).onClick(() => {
      this.state = AnimationStatus.Running
    }).margin(5)
    // 创建一个按钮 '暂停',设置宽度为 100,内边距为 5,点击按钮时执行状态切换为 Paused
    Button('暂停').width(100).padding(5).onClick(() => {
      this.state = AnimationStatus.Paused 
    }).margin(5)
    // 创建一个按钮 '结束',设置宽度为 100,内边距为 5,点击按钮时执行状态切换为 Stopped
    Button('结束').width(100).padding(5).onClick(() => {
      this.state = AnimationStatus.Stopped 
    }).margin(5)
  }
  // 创建一个按钮 '开始测试',点击按钮时执行 S_login 方法

  Button('开始测试')
    .onClick(() => {
      this.S_login();
    })
}

3 展望

  我们将继续依托鸿蒙技术,挑战更高的技术难题,完善社区交流服务,并致力于创造更有影响力的解决方案。同时,我们也会把在克服技术障碍中所积累的经验和智慧传承下去,让它成为我们持续成长和创新的动力。通过展示我们的技术成果和应用路径,希望与更多开发者交流,为更多断指患者带来实质性的改善。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
收藏
回复
举报
回复
    相关推荐