中科蓝讯 长按10s开关机

中科蓝讯 长按10s开关机

  • 长按触控5秒唤醒智能语音助手

    • 事件定义和长按四秒逻辑函数定义:

      在config.h定义:

      #define FUNC_HOLD_5S_SIRI   1   //长按五秒打开siri
      

      bsp_sys.h:sys_cb1_t结构体中定义变量:

      #if FUNC_HOLD_5S_SIRI
          bool hold_flag;//按住标志
          u8 hold_count;//按住1S的次数统计
      #endif
      
      //结尾处定义函数
      #if FUNC_HOLD_5S_SIRI
      void key_5s_siri(void);
      #endif
      

      bsp_sys.c的bsp_var_init:

          #if FUNC_HOLD_5S_SIRI
          sys_cb1.hold_flag = false;
          sys_cb1.hold_count = 0;
          #endif // FUNC_HOLD_5S_SIRI
      

      bsp_sys.c的函数实现:

      #if FUNC_HOLD_5S_SIRI
      void key_5s_siri(void)
      {
          if(sys_cb1.hold_flag){
              sys_cb1.hold_count++;//统计长按1S的次数
              printf("LONG PRESS ONE TIMES=%d\n",sys_cb1.hold_count);
              if(sys_cb1.hold_count == 5){
                  user_def_key_msg(UDK_SIRI);
              }
          }
      }
      #endif // FUNC_HOLD_5S_SIRI
      
    • 长按5秒逻辑实现:

      msg_bt.c的func_bt_message_do:记录是否长按状态

          //长按调音量
          case KH_PLAY_PWR_USER_DEF:
              printf("KH_PLAY_PWR_USER_DEF\n");
           #if FUNC_HOLD_5S_SIRI
           	sys_cb1.hold_flag = true;
          #endif
              if (!xcfg_cb.kl_pwrdwn_dis) {
                  break;
              }
          case KH_PLAY_USER_DEF:
              printf("KH_PLAY_USER_DEF\n");
              #if FUNC_HOLD_5S_SIRI
           	sys_cb1.hold_flag = true;
              #endif
              func_message(get_user_def_vol_msg(xcfg_cb.user_def_kl_sel));
              break;
      

      注意不同芯片长按按键可能定义不一样,田工给我的板子是KH_PLAY_PWR_USER_DEF,我实测的调试板子出来长按是KH_PLAY_USER_DEF。

      msg_bt.c的func_bt_message:每隔一秒发送一个消息MSG_SYS_1S,在这里进行定时处理。

      void func_bt_message(u16 msg)
      {
          if (msg == NO_MSG || msg == MSG_SYS_1S) {       //减少flash缺页
              func_bt_message_m(msg);
              if (msg == MSG_SYS_1S) {
                  #if FUNC_HOLD_5S_SIRI
                      key_5s_siri();
                  #endif // FUNC_HOLD_5S_SIRI
              }
      

      如果松开按键重新统计:

           //SIRI, NEXT, PREV在长按抬键的时候响应,避免关机前切歌或呼SIRI了
          case KLU_PLAY_PWR_USER_DEF:
      #if FUNC_HOLD_5S_SIRI
              printf("CLEAR 5S SIRI\n");
              sys_cb1.hold_flag = false;  //松开清除按键
              sys_cb1.hold_count=0;
      

  • 长按触控10秒关机开机(会有提示音)

    • 长按10s开机:

      image

      image

      downloader软开机最长只有3.5秒的选项,需要自己实现代码:

      • 开关时间定义:

        u32 pwron_press_time                 : 3;   //软开机长按时间选择: 0.1秒: 0, 0.5秒: 1, 1秒: 2, 1.5秒: 3, 2秒: 4, 2.5秒: 5, 3秒: 6, 3.5秒: 7
        
        #define PWRON_PRESS_TIME                (500*xcfg_cb.pwron_press_time)                  //长按PWRKEY多长时间开机?
        #define PWROFF_PRESS_TIME               (3+3*xcfg_cb.pwroff_press_time)                 //长按PWRKEY多长时间关机?
        

        可以推出pwron_press_time为20时是10s。

      • 修改宏定义为:

        #define PWRON_PRESS_TIME                (500*20)                  //长按PWRKEY多长时间开机?
        
    • 长按10s关机:

      在长按5s的逻辑函数key_5s_siri下实现关机:(因为懒得改函数名了,姑且这样看着)

      
      #if FUNC_HOLD_5S_SIRI
      void key_5s_siri(void)
      {
          if(sys_cb1.hold_flag){
              sys_cb1.hold_count++;//统计长按1S的次数
              printf("LONG PRESS ONE TIMES=%d\n",sys_cb1.hold_count);
              if(sys_cb1.hold_count == 10){
                  sys_cb.discon_reason = !xcfg_cb.bt_tswi_kpwr_en;       //按键关机是否主从切换
                  sys_cb.pwrdwn_tone_en = 1;
                  func_cb.sta = FUNC_PWROFF;
              }
              if(sys_cb1.hold_count == 5){
                  user_def_key_msg(UDK_SIRI);
              }
          }
      }
      #endif // FUNC_HOLD_5S_SIRI
      
    • 相关设置:

      image

      image

posted @   阿四与你  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示
主题色彩